﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CMISLibrary.Entities;
using CMISLibrary;
using BCNPCObject.DB;
namespace BCNPCObject
{
    public class cls_NPC_INTOGCS_Controller
    {
        #region -- dat hang kieu cu

        //public DataSet TH_INTOGCS(Int16 i16NamHD, Int16 i16ThangHD, Int16 i16Ky, string strMa_dviqly, string strMa_sogcs, string strMa_khang, ref string strErr)
        //{
        //    try
        //    {

        //        var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
        //                         where p.MA_DVIQLY == strMa_dviqly
        //                         && p.MA_SOGCS == strMa_sogcs
        //                         //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
        //                         select new
        //                         {
        //                             p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
        //                             p.MA_DDO,  // = pgroup.Key.MA_DDO,
        //                             p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
        //                             p.STT,
        //                             p.NGAY_HLUC,
        //                             p.ID_QHE
        //                         }).ToList();
        //        if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

        //        string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

        //        var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
        //                                  where p.MA_DVIQLY == strMa_dviqly
        //                                  && ArrDDO.Contains(p.MA_DDO)
        //                                  select p).ToList();

        //        var DDOMaxHL = DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));

        //        //danh sach diem do hien tai thuoc so
        //        var DDOSOGCSfin = (from p in DDOMaxHL
        //                           where p.MA_SOGCS == strMa_sogcs
        //                           select p).ToList();



        //        //var qddosogcsMax = from p in qddosogcs
        //        //                   where p.NGAY_HLUC == qddosogcs.Where(c => c.MA_DDO == p.MA_DDO).Max(c2 => c2.NGAY_HLUC)
        //        //                   select p;
        //        //var qddosogcsMaxHL = qddosogcs.Where(c => c.NGAY_HLUC == qddosogcs.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
        //        //var qddosogcsMaxHL2 = qddosogcs.Where(c => c.ID_QHE == qddosogcs.Where(c2 => c2.ID_QHE == c.ID_QHE).Max(c3 => c3.ID_QHE));

        //        string[] ArrMADDO = DDOSOGCSfin.Select(c => c.MA_DDO).Distinct().ToArray();

        //        if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

        //        //var nl = ArrMADDO.AsEnumerable();

        //        var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
        //                      where p.MA_DVIQLY == strMa_dviqly
        //                      && ArrMADDO.Contains(p.MA_DDO)
        //                      select p).ToList();

        //        if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }


        //        var DIEMDOMaxHL1 = DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1);

        //        var DIEMDOMaxHL = DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT));
        //        if (DIEMDOMaxHL.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }


        //        var DIEMDO1 = from p in CMIS2.DB.HDG_DIEM_DO
        //                      where CMIS2.DB.HDG_DDO_SOGCS.All(sgcs => p.MA_DVIQLY == sgcs.MA_DVIQLY && p.MA_DDO == sgcs.MA_DDO && sgcs.MA_SOGCS == strMa_sogcs)
        //                      && p.MA_DVIQLY == strMa_dviqly
        //                      select new
        //                      {
        //                          p.MA_DDO
        //                      };

        //        var DIEMDO2 = from p in CMIS2.DB.HDG_DIEM_DO
        //                      where DDOSOGCSfin.All(sgcs => p.MA_DVIQLY == sgcs.MA_DVIQLY && p.MA_DDO == sgcs.MA_DDO && sgcs.MA_SOGCS == strMa_sogcs)
        //                      && p.MA_DVIQLY == strMa_dviqly
        //                      select new
        //                      {
        //                          p.MA_DDO
        //                      };

        //        var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
        //                     where p.MA_DVIQLY == strMa_dviqly
        //                     && ArrMADDO.Contains(p.MA_DDO)
        //                     select p).ToList();

        //        var VTDDOMaxHL = VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
        //        if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }

        //        string[] ArrTRAM = VTDDOMaxHL.Select(c => c.MA_TRAM).Distinct().ToArray();
        //        string[] ArrLO = VTDDOMaxHL.Select(c => c.MA_LO).Distinct().ToArray();
        //        string[] ArrTO = VTDDOMaxHL.Select(c => c.MA_TO).Distinct().ToArray();

        //        var TRAM = (from p in CMIS2.DB.D_TRAM
        //                    where p.MA_DVIQLY == strMa_dviqly
        //                    && ArrTRAM.Contains(p.MA_TRAM)
        //                    select p).ToList();
        //        if (TRAM.Count() < 1) { strErr = "Không lấy được danh sách trạm"; }

        //        var LO = (from p in CMIS2.DB.D_LO
        //                  where p.MA_DVIQLY == strMa_dviqly
        //                  && ArrLO.Contains(p.MA_LO)
        //                  select p).ToList();
        //        if (LO.Count() < 1) { strErr = "Không lấy được danh sách lộ"; }

        //        var TO = (from p in CMIS2.DB.D_TO
        //                  where p.MA_DVIQLY == strMa_dviqly
        //                  && ArrTO.Contains(p.MA_TO)
        //                  select p).ToList();
        //        if (TO.Count() < 1) { strErr = "Không lấy được danh sách tổ"; }


        //        var joi1 = from p in DDOSOGCSfin.ToList()
        //                   join m in DIEMDOMaxHL.ToList()
        //                   on new { p.MA_DDO } equals new { m.MA_DDO }
        //                   select new
        //                   {
        //                       p.MA_DDO,
        //                       p.MA_DVIQLY,
        //                       p.MA_SOGCS,
        //                       p.STT,
        //                       m.MA_KHANG,
        //                       m.DIA_CHI,
        //                       m.SO_HO,
        //                       m.SO_PHA
        //                   };

        //        string[] ArrMAKHANG = joi1.Select(c => c.MA_KHANG).Distinct().ToArray();
        //        if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

        //        var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
        //                         where p.MA_DVIQLY == strMa_dviqly
        //                         && ArrMAKHANG.Contains(p.MA_KHANG)
        //                         select p).ToList();
        //        if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

        //        var KHACHHANGMaxHL = KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1);
        //        if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

        //        long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

        //        var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
        //                       where p.MA_DVIQLY == strMa_dviqly
        //                       && ArrIDHDONG.Contains(p.ID_HDONG)
        //                       select p).ToList();

        //        var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
        //        if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

        //        var joi2 = (from p in joi1.ToList()
        //                    join m in KHACHHANGMaxHL.ToList()
        //                    on new { p.MA_KHANG } equals new { m.MA_KHANG }
        //                    select new
        //                    {
        //                        p.MA_DDO,
        //                        p.MA_DVIQLY,
        //                        p.MA_SOGCS,
        //                        p.STT,
        //                        p.MA_KHANG,
        //                        p.DIA_CHI,
        //                        p.SO_HO,
        //                        p.SO_PHA,
        //                        m.TEN_KHANG,
        //                        m.ID_HDONG,
        //                        m.MA_NN
        //                    }).ToList();

        //        //var APGIA = (from p in CMIS2.DB.HDG_BBAN_APGIA
        //        //             where p.MA_DVIQLY == strMa_dviqly
        //        //             && ArrMADDO.Contains(p.MA_DDO)
        //        //             select p).ToList();

        //        //var APGIAMaxHL = APGIA.Where(c => c.NGAY_HLUC == APGIA.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
        //        //if (APGIAMaxHL.Count() < 1) { strErr = "Không lấy được thông tin áp giá"; return null; }



        //        //var joi3 = from p in APGIAMaxHL.ToList()
        //        //           join m in joi2.ToList()
        //        //           on new { p.MA_DDO } equals new { m.MA_DDO } into n1
        //        //           from n in n1.DefaultIfEmpty()
        //        //           select new
        //        //           {
        //        //               n.MA_DDO,
        //        //               n.MA_DVIQLY,
        //        //               n.MA_SOGCS,
        //        //               n.STT,
        //        //               n.MA_KHANG,
        //        //               n.DIA_CHI,
        //        //               n.SO_HO,
        //        //               n.TEN_KHANG,
        //        //               n.ID_HDONG,
        //        //               CHUOI_GIA = get_chuoigia(strMa_dviqly, p.MA_DDO),
        //        //               MA_NHOMNN = p.MA_NHOMNN,
        //        //               DINH_MUC = p.DINH_MUC
        //        //           };

        //        //var joi3 = from p in joi2.ToList()
        //        //           join m in APGIAMaxHL.ToList()
        //        //           on new { p.MA_DDO } equals new { m.MA_DDO }
        //        //           select new
        //        //           {
        //        //               p.MA_DDO,
        //        //               p.MA_DVIQLY,
        //        //               p.MA_SOGCS,
        //        //               p.STT,
        //        //               p.MA_KHANG,
        //        //               p.DIA_CHI,
        //        //               p.SO_HO,
        //        //               p.TEN_KHANG,
        //        //               p.ID_HDONG,
        //        //               CHUOI_GIA = get_chuoigia(strMa_dviqly, p.MA_DDO),
        //        //               MA_NHOMNN = m.MA_NHOMNN,
        //        //               DINH_MUC = m.DINH_MUC
        //        //           };

        //        var joi3 = (from p in joi2.ToList()
        //                    select new
        //                    {
        //                        p.MA_DDO,
        //                        p.MA_DVIQLY,
        //                        p.MA_SOGCS,
        //                        p.STT,
        //                        p.MA_KHANG,
        //                        p.DIA_CHI,
        //                        p.SO_HO,
        //                        p.TEN_KHANG,
        //                        p.ID_HDONG,
        //                        p.SO_PHA,
        //                        CHUOI_GIA = get_chuoigia_dathang(strMa_dviqly, p.MA_DDO),
        //                        MA_NHOMNN = p.MA_NN,
        //                        DINH_MUC = ""//m.DINH_MUC
        //                    }).ToList();


        //        var GCS = LayTTin_ChiSo(strMa_dviqly, ArrMADDO);
        //        if (GCS.Count() < 1) { strErr = "Không lấy được chỉ số"; return null; }

        //        //var GCS = from p in CMIS2.DB.GCS_CHISO
        //        //          where p.MA_DVIQLY == strMa_dviqly
        //        //          && ArrMADDO.Contains(p.MA_DDO)
        //        //          && p.THANG == i16ThangHD
        //        //          && p.NAM == i16NamHD
        //        //          && p.KY == i16Ky
        //        //          select p;                

        //        var joi4 = (from p in joi3
        //                    join m in GCS
        //                    on new { p.MA_DDO } equals new { m.MA_DDO }
        //                    select new
        //                    {
        //                        p.MA_DDO,
        //                        p.MA_DVIQLY,
        //                        p.MA_SOGCS,
        //                        p.STT,
        //                        p.MA_KHANG,
        //                        p.DIA_CHI,
        //                        p.SO_HO,
        //                        p.TEN_KHANG,
        //                        p.ID_HDONG,
        //                        p.CHUOI_GIA,
        //                        p.MA_NHOMNN,
        //                        p.DINH_MUC,
        //                        p.SO_PHA,
        //                        m.KY,
        //                        m.THANG,
        //                        m.NAM,
        //                        m.CHISO_MOI,
        //                        m.CHISO_CU,
        //                        m.LOAI_CHISO,
        //                        m.BCS,
        //                        m.HS_NHAN,
        //                        m.MA_CTO,
        //                        m.SO_CTO
        //                    }).ToList();

        //        //var BCS = (from p in CMIS2.DB.DD_BCS_CTO
        //        //          where p.MA_DVIQLY == strMa_dviqly
        //        //          && ArrMADDO.Contains(p.MA_DDO)
        //        //          select p).ToList();

        //        //var BCSMaxIDbban = BCS.Where(t => t.ID_BBAN == BCS.Where(t2 => t2.MA_DDO == t.MA_DDO).Max(t3 => t3.ID_BBAN));
        //        //if (BCSMaxIDbban.Count() < 1) { strErr = "Không lấy được bộ chỉ số"; return null; }

        //        //string[] ArrMACTO = BCSMaxIDbban.Select(c => c.MA_CTO).Distinct().ToArray();

        //        string[] ArrMACTO = GCS.Select(c => c.MA_CTO).Distinct().ToArray();

        //        var CTO = (from p in CMIS2.DB.DD_HOSO_CTO
        //                   where p.MA_DVIQLY == strMa_dviqly
        //                   && ArrMACTO.Contains(p.MA_CTO)
        //                   select p).ToList();
        //        if (CTO.Count() < 1) { strErr = "Không lấy được thông tin công tơ"; return null; }

        //        string[] CLOAI = CTO.Select(c => c.MA_CLOAI).Distinct().ToArray();


        //        var D_CLOAI_CTO = (from p in CMIS2.DB.D_CLOAI_CTO
        //                           where CLOAI.Contains(p.MA_CLOAI)
        //                           select new { p.MA_CLOAI, p.SO_PHA, p.MA_NUOC, p.SO_CSO }).ToList();

        //        var CLOAICTO = (from p in CTO
        //                        select new
        //                        {
        //                            p.MA_DVIQLY,
        //                            p.MA_CTO,
        //                            SO_PHA = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_PHA).FirstOrDefault(),
        //                            MA_NUOC = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
        //                            SO_CSO = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_CSO).FirstOrDefault()
        //                        }).ToList();

        //        var KDINH = (from p in CMIS2.DB.DD_KDINH_CTO
        //                     where p.MA_DVIQLY == strMa_dviqly
        //                     && ArrMACTO.Contains(p.MA_CTO)
        //                     select p).ToList();


        //        var KDINHMaxHL = KDINH.Where(c => c.ID_BBAN_KDINH == KDINH.Where(c2 => c2.MA_CTO == c.MA_CTO).Max(c3 => c3.ID_BBAN_KDINH));

        //        // lay han kiem dinh
        //        var KDINHMaxHLjoiCLOAICTO = from p in KDINHMaxHL
        //                                    join m in CLOAICTO
        //                                    on new { p.MA_CTO } equals new { m.MA_CTO }
        //                                    select new
        //                                    {
        //                                        p.MA_CTO,
        //                                        m.SO_PHA,
        //                                        m.MA_NUOC,
        //                                        m.SO_CSO,
        //                                        HAN_KDINH = m.SO_PHA.ToString() == "1" ? p.NGAY_KDINH.Value.AddYears(5).ToString("dd/MM/yyyy") : p.NGAY_KDINH.Value.AddYears(2).ToString("dd/MM/yyyy")
        //                                    };

        //        var HANKDINH = (from p in KDINHMaxHLjoiCLOAICTO
        //                        select p).ToList();




        //        //var CTOf = from p in CMIS2.DB.DD_HOSO_CTO
        //        //          join m in BCSMaxIDbban
        //        //          on new { p.MA_DVIQLY, p.MA_CTO, p.SO_CTO } equals new { m.MA_DVIQLY, m.MA_CTO, m.SO_CTO }
        //        //          select p;

        //        var joi5 = (from p in joi4
        //                    join m in VTDDOMaxHL
        //                    on new { p.MA_DDO } equals new { m.MA_DDO }
        //                    select new
        //                    {
        //                        p.MA_DDO,
        //                        p.MA_DVIQLY,
        //                        p.MA_SOGCS,
        //                        p.STT,
        //                        p.MA_KHANG,
        //                        p.DIA_CHI,
        //                        p.SO_HO,
        //                        p.TEN_KHANG,
        //                        p.ID_HDONG,
        //                        p.CHUOI_GIA,
        //                        p.MA_NHOMNN,
        //                        p.DINH_MUC,
        //                        p.KY,
        //                        p.THANG,
        //                        p.NAM,
        //                        p.CHISO_MOI,
        //                        p.CHISO_CU,
        //                        p.LOAI_CHISO,
        //                        p.BCS,
        //                        p.HS_NHAN,
        //                        p.MA_CTO,
        //                        p.SO_CTO,
        //                        p.SO_PHA,
        //                        m.MA_LO,
        //                        m.MA_TO,
        //                        m.MA_TRAM,
        //                        m.SO_COT,
        //                        m.SO_HOM,
        //                        m.PHA
        //                    }).ToList();

        //        //var joi6 = (from p in joi5
        //        //           join m in BCSMaxIDbban
        //        //           on new { p.MA_DDO, p.BCS } equals new { m.MA_DDO, m.BCS }
        //        //           select new 
        //        //           {
        //        //               p.MA_DDO,
        //        //               p.MA_DVIQLY,
        //        //               p.MA_SOGCS,
        //        //               p.STT,
        //        //               p.MA_KHANG,
        //        //               p.DIA_CHI,
        //        //               p.SO_HO,
        //        //               p.TEN_KHANG,
        //        //               p.ID_HDONG,
        //        //               p.CHUOI_GIA,
        //        //               p.MA_NHOMNN,
        //        //               p.DINH_MUC,
        //        //               p.KY,
        //        //               p.THANG,
        //        //               p.NAM,
        //        //               p.CHISO_MOI,
        //        //               p.CHISO_CU,
        //        //               p.LOAI_CHISO,
        //        //               p.BCS,
        //        //               p.HS_NHAN,
        //        //               p.MA_CTO,
        //        //               p.SO_CTO,
        //        //               p.MA_LO,
        //        //               p.MA_TO,
        //        //               p.MA_TRAM,
        //        //               p.PHA,
        //        //               p.SO_COT,
        //        //               p.SO_HOM,
        //        //               m.SO_CTO,
        //        //               m.MA_CTO,
        //        //               HSN = m.HS_NHAN
        //        //           }).ToList();

        //        var joi7 = (from p in joi5
        //                    join m in CTO
        //                    on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
        //                    orderby p.STT
        //                    select new
        //                    {
        //                        CHON = false,
        //                        p.MA_DDO,
        //                        p.MA_DVIQLY,
        //                        p.MA_SOGCS,
        //                        p.STT,
        //                        p.MA_KHANG,
        //                        p.DIA_CHI,
        //                        p.SO_HO,
        //                        p.TEN_KHANG,
        //                        p.ID_HDONG,
        //                        p.CHUOI_GIA,
        //                        p.MA_NHOMNN,
        //                        p.DINH_MUC,
        //                        KY = p.KY.ToString(),
        //                        THANG = p.THANG.ToString(),
        //                        NAM = p.NAM.ToString(),
        //                        p.CHISO_MOI,
        //                        p.CHISO_CU,
        //                        p.LOAI_CHISO,
        //                        p.BCS,
        //                        p.HS_NHAN,
        //                        p.MA_CTO,
        //                        p.SO_CTO,
        //                        p.MA_LO,
        //                        p.MA_TO,
        //                        p.MA_TRAM,
        //                        PHA = p.SO_PHA.ToString(),
        //                        p.SO_COT,
        //                        p.SO_HOM,
        //                        HSN = p.HS_NHAN,
        //                        PHA_ABCD = p.PHA,
        //                        m.MA_CLOAI,
        //                        m.NAM_SX,
        //                        m.LOAI_SOHUU,
        //                        NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
        //                        HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
        //                        MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
        //                        SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
        //                        TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
        //                        TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
        //                        TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
        //                        MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
        //                        NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy")
        //                    }).ToList();


        //        #region
        //        /*
        //        var qddo = from q in qddosogcs.ToList()
        //                   join p in CMIS2.DB.HDG_DIEM_DO.ToList()
        //                   on new { q.MA_DVIQLY, q.MA_DDO }
        //                   equals new { p.MA_DVIQLY, p.MA_DDO } into A1
        //                   from p in A1.DefaultIfEmpty()     
        //                   //where p.MA_DVIQLY == strMa_dviqly
        //                   //&& p.MA_DDO == "PA13AS0000004001"
        //                   select new
        //                   {
        //                       p.MA_DDO,
        //                       p.MA_KHANG,
        //                       q.MA_SOGCS,
        //                       //q.STT
        //                       //p.MA_DVIQLY,
        //                       //p.MA_DDO,
        //                       //p.MA_KHANG,
        //                       //p.DIA_CHI,
        //                       //p.SO_HO,
        //                       //m.MA_SOGCS,
        //                       //m.STT
        //                   };
        //         * */


        //        /*
        //        var qkh = from p in CMIS2.DB.HDG_KHACH_HANG.ToList()
        //                  join m in qddo.ToList() on new { p.MA_DVIQLY, p.MA_KHANG }
        //                                          equals new { m.MA_DVIQLY, m.MA_KHANG }
        //                  select new 
        //                  { 
        //                      m.MA_DVIQLY,
        //                      m.MA_KHANG,
        //                      p.TEN_KHANG,
        //                      m.MA_DDO,
        //                      m.MA_SOGCS,
        //                      m.SO_HO,
        //                      m.STT,
        //                      m.DIA_CHI
        //                  };

        //        var apgia = from p in CMIS2.DB.HDG_BBAN_APGIA.ToList()
        //                    join m in qkh.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
        //                                            equals new { m.MA_DVIQLY, m.MA_DDO }
        //                    select new 
        //                    {
        //                        m.MA_DVIQLY,
        //                        m.MA_KHANG,
        //                        m.TEN_KHANG,
        //                        m.MA_DDO,
        //                        m.MA_SOGCS,
        //                        m.SO_HO,
        //                        m.STT,
        //                        m.DIA_CHI,
        //                        p.DINH_MUC,
        //                        p.LOAI_DMUC,
        //                        p.MA_NHOMNN
        //                    };

        //        var chiso = from p in CMIS2.DB.GCS_CHISO.ToList()
        //                    join m in apgia.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
        //                                             equals new { m.MA_DVIQLY, m.MA_DDO } 
        //                    where p.THANG == i16ThangHD
        //                    && p.NAM == i16NamHD
        //                    && p.KY == i16Ky
        //                    select new 
        //                    {
        //                        m.MA_DVIQLY,
        //                        m.MA_KHANG,
        //                        m.TEN_KHANG,
        //                        m.MA_DDO,
        //                        m.MA_SOGCS,
        //                        m.SO_HO,
        //                        m.STT,
        //                        m.DIA_CHI,
        //                        m.DINH_MUC,
        //                        m.LOAI_DMUC,
        //                        m.MA_NHOMNN,
        //                        p.KY,
        //                        p.THANG,
        //                        p.NAM,
        //                        p.CHISO_MOI,
        //                        p.CHISO_CU,
        //                        p.LOAI_CHISO
        //                    };
        //        var vitriddo = from p in CMIS2.DB.HDG_VITRI_DDO.ToList()
        //                       join m in chiso.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
        //                                                equals new { m.MA_DVIQLY, m.MA_DDO }
        //                       select new 
        //                       {
        //                           m.MA_DVIQLY,
        //                           m.MA_KHANG,
        //                           m.TEN_KHANG,
        //                           m.MA_DDO,
        //                           m.MA_SOGCS,
        //                           m.SO_HO,
        //                           m.STT,
        //                           m.DIA_CHI,
        //                           m.DINH_MUC,
        //                           m.LOAI_DMUC,
        //                           m.MA_NHOMNN,
        //                           m.KY,
        //                           m.THANG,
        //                           m.NAM,
        //                           m.CHISO_MOI,
        //                           m.CHISO_CU,
        //                           m.LOAI_CHISO,
        //                           p.MA_TRAM,
        //                           p.MA_LO,
        //                           p.MA_TO,
        //                           p.PHA,
        //                           p.SO_COT,
        //                           p.SO_HOM
        //                       };

        //        var bcs = from p in CMIS2.DB.DD_BCS_CTO.ToList()
        //                  join m in vitriddo.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
        //                                                equals new { m.MA_DVIQLY, m.MA_DDO }
        //                  select new 
        //                  {
        //                      m.MA_DVIQLY,
        //                      m.MA_KHANG,
        //                      m.TEN_KHANG,
        //                      m.MA_DDO,
        //                      m.MA_SOGCS,
        //                      m.SO_HO,
        //                      m.STT,
        //                      m.DIA_CHI,
        //                      m.DINH_MUC,
        //                      m.LOAI_DMUC,
        //                      m.MA_NHOMNN,
        //                      m.KY,
        //                      m.THANG,
        //                      m.NAM,
        //                      m.CHISO_MOI,
        //                      m.CHISO_CU,
        //                      m.LOAI_CHISO,
        //                      m.MA_TRAM,
        //                      m.MA_LO,
        //                      m.MA_TO,
        //                      m.PHA,
        //                      m.SO_COT,
        //                      m.SO_HOM,
        //                      p.MA_CTO,
        //                      p.SO_CTO,
        //                      p.HS_NHAN
        //                  };

        //        var hosocto = from p in CMIS2.DB.DD_HOSO_CTO.ToList()
        //                      join m in bcs.ToList() on new { p.MA_DVIQLY, p.MA_CTO }
        //                                             equals new { m.MA_DVIQLY, m.MA_CTO }
        //                      select new 
        //                      {
        //                          m.MA_DVIQLY,
        //                          m.MA_KHANG,
        //                          m.TEN_KHANG,
        //                          m.MA_DDO,
        //                          m.MA_SOGCS,
        //                          m.SO_HO,
        //                          m.STT,
        //                          m.DIA_CHI,
        //                          m.DINH_MUC,
        //                          m.LOAI_DMUC,
        //                          m.MA_NHOMNN,
        //                          m.KY,
        //                          m.THANG,
        //                          m.NAM,
        //                          m.CHISO_MOI,
        //                          m.CHISO_CU,
        //                          m.LOAI_CHISO,
        //                          m.MA_TRAM,
        //                          m.MA_LO,
        //                          m.MA_TO,
        //                          m.PHA,
        //                          m.SO_COT,
        //                          m.SO_HOM,
        //                          m.MA_CTO,
        //                          m.SO_CTO,
        //                          m.HS_NHAN,
        //                          p.MA_CLOAI,
        //                          p.LOAI_SOHUU,
        //                          p.NAM_SX
        //                      };

        //        var tramloto = from p in CMIS2.DB.D_TRAM.ToList()
        //                       join m in hosocto.ToList() on new { p.MA_DVIQLY, p.MA_TRAM }
        //                                                    equals new { m.MA_DVIQLY, m.MA_TRAM }
        //                       from w in CMIS2.DB.D_LO.ToList()
        //                       join w1 in hosocto.ToList() on new { w.MA_DVIQLY, w.MA_LO }
        //                                                    equals new { w1.MA_DVIQLY, w1.MA_LO }
        //                       from e in CMIS2.DB.D_TO.ToList()
        //                       join e1 in hosocto.ToList() on new { e.MA_DVIQLY, e.MA_TO }
        //                                                    equals new { e1.MA_DVIQLY, e1.MA_TO }
        //                       select new 
        //                       {
        //                           m.MA_DVIQLY,
        //                           m.MA_KHANG,
        //                           m.TEN_KHANG,
        //                           m.MA_DDO,
        //                           m.MA_SOGCS,
        //                           m.SO_HO,
        //                           m.STT,
        //                           m.DIA_CHI,
        //                           m.DINH_MUC,
        //                           m.LOAI_DMUC,
        //                           m.MA_NHOMNN,
        //                           m.KY,
        //                           m.THANG,
        //                           m.NAM,
        //                           m.CHISO_MOI,
        //                           m.CHISO_CU,
        //                           m.LOAI_CHISO,
        //                           m.MA_TRAM,
        //                           m.MA_LO,
        //                           m.MA_TO,
        //                           m.PHA,
        //                           m.SO_COT,
        //                           m.SO_HOM,
        //                           m.MA_CTO,
        //                           m.SO_CTO,
        //                           m.HS_NHAN,
        //                           m.MA_CLOAI,
        //                           m.LOAI_SOHUU,
        //                           m.NAM_SX,
        //                           p.TEN_TRAM,
        //                           w.TEN_LO,
        //                           e.TEN_TO
        //                       };

        //        */
        //        #endregion

        //        if (joi7 != null && joi7.Count > 0)
        //        {
        //            DataTable dt = Utility.LINQToDataTable(joi7);
        //            dt.TableName = "KQ";
        //            DataSet ds = new DataSet();
        //            ds.Tables.Add(dt);
        //            return ds;
        //        }
        //        return null;


        //        //     HDG_KHACH_HANG K1,
        //        //HDG_DIEM_DO D1,
        //        //HDG_DDO_SOGCS S1,
        //        //HDG_BBAN_APGIA AG1,
        //        //GCS_CHISO CS1,
        //        //HDG_VITRI_DDO DVT,
        //        //DD_BCS_CTO CT1,
        //        //DD_HOSO_CTO HSCT
        //    }
        //    catch
        //    { strErr = "Không lấy được dữ liệu"; return null; }
        //}

        #endregion

        #region -- dat hang lay giong kieu mau chung

        public DataSet TH_INTOGCS(Int16 i16NamHD, Int16 i16ThangHD, Int16 i16Ky, string strMa_dviqly, string strMa_sogcs, string strMa_khang, ref string strErr)
        {
            try
            {
                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                //danh sach diem do hien tai thuoc so                               
                var DDDOSOGCS = (from p in DDOMaxHL
                                 where p.MA_SOGCS == strMa_sogcs
                                 select p).ToList();

                string[] ArrDDOSOGCS = DDDOSOGCS.Select(c => c.MA_DDO).Distinct().ToArray();

                List<GCS_CHISO> GCS1 = new List<GCS_CHISO>();

                // Lấy ra những điểm đo còn treo công tơ và treo công tơ cơ

                GCS1 = LayTTin_ChiSo(strMa_dviqly, ArrDDOSOGCS);


                // Mảng diem do hien tai thuoc so và là điểm đo treo công tơ cơ
                string[] ArrDDOSOGCS_Co = GCS1.Select(c => c.MA_DDO).Distinct().ToArray();



                //danh sach diem do hien tai thuoc so và treo công tơ cơ
                var DDOSOGCSfin = (from p in DDDOSOGCS
                                   where p.MA_SOGCS == strMa_sogcs
                                   && ArrDDOSOGCS_Co.Contains(p.MA_DDO)
                                   select p).ToList();




                string[] ArrMADDO = DDOSOGCSfin.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  MA_CAPDA = "0" + p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                // Lấy cấp Điện áp của điểm đo
                var CAPDAP = (from p in DIEMDOMaxHL
                              join m in CMIS2.DB.D_CAP_DAP
                              on new { p.MA_CAPDA } equals new { m.MA_CAPDA }
                              select new
                              {
                                  p.MA_DDO,
                                  m.TEN_CAPDA
                              }).ToList();



                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select p).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }

                string[] ArrTRAM = VTDDOMaxHL.Select(c => c.MA_TRAM).Distinct().ToArray();
                string[] ArrLO = VTDDOMaxHL.Select(c => c.MA_LO).Distinct().ToArray();
                string[] ArrTO = VTDDOMaxHL.Select(c => c.MA_TO).Distinct().ToArray();

                var TRAM = (from p in CMIS2.DB.D_TRAM
                            where p.MA_DVIQLY == strMa_dviqly
                            && ArrTRAM.Contains(p.MA_TRAM)
                            select p).ToList();
                if (TRAM.Count() < 1) { strErr = "Không lấy được danh sách trạm"; }

                var LO = (from p in CMIS2.DB.D_LO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrLO.Contains(p.MA_LO)
                          select p).ToList();
                if (LO.Count() < 1) { strErr = "Không lấy được danh sách lộ"; }

                var TO = (from p in CMIS2.DB.D_TO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrTO.Contains(p.MA_TO)
                          select p).ToList();
                if (TO.Count() < 1) { strErr = "Không lấy được danh sách tổ"; }


                var joi1 = (from p in DDOSOGCSfin.ToList()
                            join m in DIEMDOMaxHL.ToList()
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                m.MA_KHANG,
                                m.DIA_CHI,
                                m.SO_HO,
                                m.SO_PHA,
                                m.CSUAT
                            }).ToList();

                string[] ArrMAKHANG = joi1.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select p).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi2 = (from p in joi1
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.SO_PHA,
                                p.CSUAT,
                                m.TEN_KHANG,
                                m.ID_HDONG,
                                m.MA_NN
                            }).ToList();

                //var APGIA = (from p in CMIS2.DB.HDG_BBAN_APGIA
                //             where p.MA_DVIQLY == strMa_dviqly
                //             && ArrMADDO.Contains(p.MA_DDO)
                //             select p).ToList();

                //var APGIAMaxHL = APGIA.Where(c => c.NGAY_HLUC == APGIA.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
                //if (APGIAMaxHL.Count() < 1) { strErr = "Không lấy được thông tin áp giá"; return null; }


                var joi3 = (from p in joi2
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.MA_NN,
                                p.SO_PHA,
                                p.CSUAT,
                                CHUOI_GIA = get_chuoigia_dathang(strMa_dviqly, p.MA_DDO),
                                DINH_MUC = ""//m.DINH_MUC
                            }).ToList();


                List<GCS_CHISO> GCS = new List<GCS_CHISO>();


                GCS = LayTTin_ChiSo(strMa_dviqly, ArrMADDO);


                if (GCS.Count() < 1) { strErr = "Không lấy được chỉ số"; return null; }



                var joi4 = (from p in joi3
                            join m in GCS
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                m.KY,
                                m.THANG,
                                m.NAM,
                                m.CHISO_MOI,
                                m.CHISO_CU,
                                m.LOAI_CHISO,
                                m.BCS,
                                m.HS_NHAN,
                                m.MA_CTO,
                                m.SO_CTO
                            }).ToList();


                string[] ArrMACTO = GCS.Select(c => c.MA_CTO).Distinct().ToArray();

                var CTO = (from p in CMIS2.DB.DD_HOSO_CTO
                           where p.MA_DVIQLY == strMa_dviqly
                           && ArrMACTO.Contains(p.MA_CTO)
                           select p).ToList();
                if (CTO.Count() < 1) { strErr = "Không lấy được thông tin công tơ"; return null; }

                string[] CLOAI = CTO.Select(c => c.MA_CLOAI).Distinct().ToArray();


                var D_CLOAI_CTO = (from p in CMIS2.DB.D_CLOAI_CTO
                                   where CLOAI.Contains(p.MA_CLOAI)
                                   select new { p.MA_CLOAI, p.SO_PHA, p.MA_NUOC, p.SO_CSO, p.DONG_DIEN, p.HANGSO_K }).ToList();

                var CLOAICTO = (from p in CTO
                                select new
                                {
                                    p.MA_DVIQLY,
                                    p.MA_CTO,
                                    SO_PHA = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_PHA).FirstOrDefault(),
                                    MA_NUOC = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                    SO_CSO = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                    DONG_DIEN = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                    HANGSO_K = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.HANGSO_K).FirstOrDefault()
                                }).ToList();

                var KDINH = (from p in CMIS2.DB.DD_KDINH_CTO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMACTO.Contains(p.MA_CTO)
                             select p).ToList();

                var BDONGHTAI_CTO = (from p in CMIS2.DB.DD_BDONG_HTAI
                                     where p.MA_DVIQLY == strMa_dviqly
                                     && ArrMACTO.Contains(p.MA_TBI)
                                     select new
                                     {
                                         MA_CTO = p.MA_TBI,
                                         p.NGAY_BDONG
                                     }).ToList();


                var KDINHMaxHL = (KDINH.Where(c => c.ID_BBAN_KDINH == KDINH.Where(c2 => c2.MA_CTO == c.MA_CTO).Max(c3 => c3.ID_BBAN_KDINH))).ToList();

                // lay han kiem dinh
                var KDINHMaxHLjoiCLOAICTO = (from p in KDINHMaxHL
                                             join m in CLOAICTO
                                             on new { p.MA_CTO } equals new { m.MA_CTO }
                                             select new
                                             {
                                                 p.MA_CTO,
                                                 m.SO_PHA,
                                                 m.MA_NUOC,
                                                 m.SO_CSO,
                                                 m.DONG_DIEN,
                                                 m.HANGSO_K,
                                                 NGAY_KDINH = p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.ToString("dd/MM/yyyy"),
                                                 HAN_KDINH = m.SO_PHA.ToString() == "1" ? (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(5).ToString("dd/MM/yyyy")) : (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(2).ToString("dd/MM/yyyy"))
                                             }).ToList();

                var HANKDINH = (from p in KDINHMaxHLjoiCLOAICTO
                                join m in BDONGHTAI_CTO
                                on new { p.MA_CTO } equals new { m.MA_CTO }
                                select new
                                {
                                    p.MA_CTO,
                                    p.SO_PHA,
                                    p.MA_NUOC,
                                    p.SO_CSO,
                                    p.DONG_DIEN,
                                    HANGSO_K = p.HANGSO_K,
                                    p.NGAY_KDINH,
                                    p.HAN_KDINH,
                                    NGAY_BDONG = m.NGAY_BDONG.Date.ToString("dd/MM/yyyy")
                                }).ToList();

                // lấy TU trong DD_BDONG_HTAI
                var TU = (from p in CMIS2.DB.DD_BDONG_TU
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TUmaxID = (TU.Where(c => c.ID_BBAN == TU.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TUKdinh = (from p in TUmaxID
                               join m in CMIS2.DB.DD_KDINH_TU
                              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TU,
                                   m.NGAY_KDINH
                               }).ToList();

                // Không đúng
                //var TUKdinh = (from p in CMIS2.DB.DD_KDINH_TU
                //               join m in TUmaxID
                //              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                //               select new
                //               {
                //                   m.MA_DDO,
                //                   m.MA_TU,
                //                   p.NGAY_KDINH
                //               }).ToList();


                // lấy TI trong DD_BDONG_HTAI
                var TI = (from p in CMIS2.DB.DD_BDONG_TI
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TImaxID = (TI.Where(c => c.ID_BBAN == TI.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TIKdinh = (from p in TImaxID
                               join m in CMIS2.DB.DD_KDINH_TI
                              on new { p.MA_DVIQLY, p.MA_TI } equals new { m.MA_DVIQLY, m.MA_TI }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TI,
                                   m.NGAY_KDINH
                               }).ToList();



                #region // lấy TI trong DD_BDONG_HTAI
                /*
                var TI = (from p in CMIS2.DB.DD_BDONG_HTAI
                          where ArrMADDO.Contains(p.MA_DDO)
                          && p.LOAI_TBI == "TI"
                          select new
                          {
                              p.MA_DVIQLY,
                              p.MA_DDO,
                              p.NGAY_BDONG,
                              p.MA_CLOAI,
                              MA_TI = p.MA_TBI
                          }).ToList();

                string[] ArrTI = TI.Select(c => c.MA_TI).Distinct().ToArray();
                string[] ArrCloaiTI = TI.Select(c => c.MA_CLOAI).Distinct().ToArray();

                var CLOAITI = (from p in CMIS2.DB.D_CLOAI_TI
                               where ArrCloaiTI.Contains(p.MA_CLOAI)
                               select new
                               {
                                   p.MA_CLOAI,
                                   p.LOAI_TI,
                                   p.MO_TA,
                                   p.SO_PHA,
                                   p.TYSO_DAU,
                                   p.CAP_CXAC,
                                   p.CAP_DAP,
                                   p.MA_NUOC,
                                   p.MA_HANG
                               }).ToList();

                var TIKDINH = (from p in CMIS2.DB.DD_KDINH_TI
                               where ArrTI.Contains(p.MA_TI)
                               && p.MA_DVIQLY == strMa_dviqly
                               select p).ToList();

                var TIKDINHMaxID = TIKDINH.Where(c => c.ID_BBAN_KDINH == TIKDINH.Where(c2 => c2.MA_TI == c.MA_TI).Max(c3 => c3.ID_BBAN_KDINH));

                var TIend = (from p in TI
                             join m in TIKDINHMaxID.ToList()
                             on new { p.MA_TI } equals new { m.MA_TI }
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.MA_DDO,
                                 p.MA_TI,
                                 p.NGAY_BDONG,
                                 m.NGAY_KDINH,
                                 TYSO_TI = CLOAITI.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.TYSO_DAU).FirstOrDefault(),
                             }).ToList();
                */
                #endregion


                var joi5 = (from p in joi4
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.KY,
                                p.THANG,
                                p.NAM,
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO,
                                p.BCS,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                m.MA_LO,
                                m.MA_TO,
                                m.MA_TRAM,
                                m.SO_COT,
                                m.SO_HOM,
                                m.PHA
                            }).ToList();



                var joi7 = (from p in joi5
                            join m in CTO
                            on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                KY = p.KY.ToString(),
                                THANG = p.THANG.ToString(),
                                NAM = p.NAM.ToString(),
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO,
                                p.BCS,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.MA_LO,
                                p.MA_TO,
                                p.MA_TRAM,
                                PHA = p.SO_PHA.ToString(),
                                CSUAT_DDO = p.CSUAT.ToString(),
                                p.SO_COT,
                                p.SO_HOM,
                                HSN = p.HS_NHAN,
                                PHA_ABCD = p.PHA,
                                MA_NHOMNN = p.MA_NN,
                                m.MA_CLOAI,
                                m.NAM_SX,
                                m.LOAI_SOHUU,
                                NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
                                HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
                                NGAY_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault(),
                                MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                DONG_DIEN = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                HANGSO_K = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault() == null ? null : HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault(),
                                TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
                                TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
                                TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
                                CSUAT_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.CSUAT_TRAM).FirstOrDefault().ToString(),
                                MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
                                NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy"),
                                CAP_DAP = CAPDAP.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.TEN_CAPDA).FirstOrDefault(),
                                TYSO_TU = TUmaxID == null ? null : (TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TU = TUKdinh == null ? null : (TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                TYSO_TI = TImaxID == null ? null : (TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TI = TIKdinh == null ? null : (TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy"))

                            }).ToList();



                if (joi7.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(joi7);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu \n" + ex.ToString();
                }
                return null;
            }
        }

        #endregion

        public List<GCS_CHISO> LayTTin_ChiSo(string strMaDVi, string[] ArrDDo)
        {
            try
            {
                CMIS2.ResetDB();
                var lstchiso = ArrDDo.AsEnumerable();
                List<GCS_CHISO> CHI_SO = new List<GCS_CHISO>();

                while (lstchiso.Count() > 0)
                {
                    var tem = lstchiso.Take(1000);
                    string[] strLoai = { "KT", "BT", "CD", "TD", "VC", "SG" };
                    List<GCS_CHISO> chiso = (from i in CMIS2.DB.GCS_CHISO
                                             where i.MA_DVIQLY == strMaDVi
                                             && tem.Contains(i.MA_DDO)
                                             && strLoai.Contains(i.BCS)
                                             select i).ToList();
                    var ID_CHISO_MAX = chiso.GroupBy(c => new { c.MA_DDO, c.BCS }).Select(k => new { k.Key.MA_DDO, k.Key.BCS, ID_CHISO = k.Max(l => l.ID_CHISO) }).ToList();
                    var KQ = (from i in chiso
                              join j in ID_CHISO_MAX on new { i.MA_DDO, i.ID_CHISO } equals new { j.MA_DDO, j.ID_CHISO }
                              select i).ToList();
                    CHI_SO = CHI_SO.Union(KQ).ToList();
                    lstchiso = lstchiso.Skip(1000);
                }

                return CHI_SO;
            }
            catch { return null; }
        }


        //Lấy thông tin tờ ghi chỉ số công tơ cơ  - mẫu chung NPC
        public DataSet TogcsNPC_Co(Int16 i16NamHD, Int16 i16ThangHD, Int16 i16Ky, string strMa_dviqly, string strMa_sogcs, string strMa_khang, string strLoaiCto, ref string strErr)
        {
            try
            {
                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                //danh sach diem do hien tai thuoc so                               
                var DDDOSOGCS = (from p in DDOMaxHL
                                 where p.MA_SOGCS == strMa_sogcs
                                 select p).ToList();

                string[] ArrDDOSOGCS = DDDOSOGCS.Select(c => c.MA_DDO).Distinct().ToArray();

                List<GCS_CHISO> GCS1 = new List<GCS_CHISO>();

                // Lấy ra những điểm đo còn treo công tơ và treo công tơ cơ
                if (strLoaiCto == "Co")
                {
                    GCS1 = LayTTin_ChiSo_Co(strMa_dviqly, ArrDDOSOGCS);
                }
                else
                {
                    return null;
                }

                // Mảng diem do hien tai thuoc so và là điểm đo treo công tơ cơ
                string[] ArrDDOSOGCS_Co = GCS1.Select(c => c.MA_DDO).Distinct().ToArray();



                //danh sach diem do hien tai thuoc so và treo công tơ cơ
                var DDOSOGCSfin = (from p in DDDOSOGCS
                                   where p.MA_SOGCS == strMa_sogcs
                                   && ArrDDOSOGCS_Co.Contains(p.MA_DDO)
                                   select p).ToList();




                string[] ArrMADDO = DDOSOGCSfin.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  MA_CAPDA = "0" + p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                // Lấy cấp Điện áp của điểm đo
                var CAPDAP = (from p in DIEMDOMaxHL
                              join m in CMIS2.DB.D_CAP_DAP
                              on new { p.MA_CAPDA } equals new { m.MA_CAPDA }
                              select new
                              {
                                  p.MA_DDO,
                                  m.TEN_CAPDA
                              }).ToList();



                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select p).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }

                string[] ArrTRAM = VTDDOMaxHL.Select(c => c.MA_TRAM).Distinct().ToArray();
                string[] ArrLO = VTDDOMaxHL.Select(c => c.MA_LO).Distinct().ToArray();
                string[] ArrTO = VTDDOMaxHL.Select(c => c.MA_TO).Distinct().ToArray();

                var TRAM = (from p in CMIS2.DB.D_TRAM
                            where p.MA_DVIQLY == strMa_dviqly
                            && ArrTRAM.Contains(p.MA_TRAM)
                            select p).ToList();
                if (TRAM.Count() < 1) { strErr = "Không lấy được danh sách trạm"; }

                var LO = (from p in CMIS2.DB.D_LO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrLO.Contains(p.MA_LO)
                          select p).ToList();
                if (LO.Count() < 1) { strErr = "Không lấy được danh sách lộ"; }

                var TO = (from p in CMIS2.DB.D_TO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrTO.Contains(p.MA_TO)
                          select p).ToList();
                if (TO.Count() < 1) { strErr = "Không lấy được danh sách tổ"; }


                var joi1 = (from p in DDOSOGCSfin.ToList()
                            join m in DIEMDOMaxHL.ToList()
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                m.MA_KHANG,
                                m.DIA_CHI,
                                SO_HO = m.SO_HO > 1 ? (m.SO_HO - 1) : 0,
                                m.SO_PHA,
                                m.CSUAT
                            }).ToList();

                string[] ArrMAKHANG = joi1.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select p).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi2 = (from p in joi1
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.SO_PHA,
                                p.CSUAT,
                                m.TEN_KHANG,
                                m.ID_HDONG,
                                m.MA_NN
                            }).ToList();

                //var APGIA = (from p in CMIS2.DB.HDG_BBAN_APGIA
                //             where p.MA_DVIQLY == strMa_dviqly
                //             && ArrMADDO.Contains(p.MA_DDO)
                //             select p).ToList();

                //var APGIAMaxHL = APGIA.Where(c => c.NGAY_HLUC == APGIA.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
                //if (APGIAMaxHL.Count() < 1) { strErr = "Không lấy được thông tin áp giá"; return null; }


                var joi3 = (from p in joi2
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.MA_NN,
                                p.SO_PHA,
                                p.CSUAT,
                                CHUOI_GIA = get_chuoigia(strMa_dviqly, p.MA_DDO),
                                DINH_MUC = ""//m.DINH_MUC
                            }).ToList();


                List<GCS_CHISO> GCS = new List<GCS_CHISO>();

                if (strLoaiCto == "Co")
                {
                    GCS = LayTTin_ChiSo_Co(strMa_dviqly, ArrMADDO);
                }
                else
                {
                    return null;
                }

                if (GCS.Count() < 1) { strErr = "Không lấy được chỉ số"; return null; }



                var joi4 = (from p in joi3
                            join m in GCS
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                m.KY,
                                m.THANG,
                                m.NAM,
                                m.CHISO_MOI,
                                m.CHISO_CU,
                                m.LOAI_CHISO,
                                m.BCS,
                                m.HS_NHAN,
                                m.MA_CTO,
                                m.SO_CTO,
                                m.MA_CNANG
                            }).ToList();


                string[] ArrMACTO = GCS.Select(c => c.MA_CTO).Distinct().ToArray();

                var CTO = (from p in CMIS2.DB.DD_HOSO_CTO
                           where p.MA_DVIQLY == strMa_dviqly
                           && ArrMACTO.Contains(p.MA_CTO)
                           select p).ToList();
                if (CTO.Count() < 1) { strErr = "Không lấy được thông tin công tơ"; return null; }

                string[] CLOAI = CTO.Select(c => c.MA_CLOAI).Distinct().ToArray();


                var D_CLOAI_CTO = (from p in CMIS2.DB.D_CLOAI_CTO
                                   where CLOAI.Contains(p.MA_CLOAI)
                                   select new { p.MA_CLOAI, p.SO_PHA, p.MA_NUOC, p.SO_CSO, p.DONG_DIEN, p.HANGSO_K }).ToList();

                var CLOAICTO = (from p in CTO
                                select new
                                {
                                    p.MA_DVIQLY,
                                    p.MA_CTO,
                                    SO_PHA = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_PHA).FirstOrDefault(),
                                    MA_NUOC = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                    SO_CSO = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                    DONG_DIEN = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                    HANGSO_K = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.HANGSO_K).FirstOrDefault()
                                }).ToList();

                var KDINH = (from p in CMIS2.DB.DD_KDINH_CTO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMACTO.Contains(p.MA_CTO)
                             select p).ToList();

                var BDONGHTAI_CTO = (from p in CMIS2.DB.DD_BDONG_HTAI
                                     where p.MA_DVIQLY == strMa_dviqly
                                     && ArrMACTO.Contains(p.MA_TBI)
                                     select new
                                     {
                                         MA_CTO = p.MA_TBI,
                                         p.NGAY_BDONG
                                     }).ToList();


                var KDINHMaxHL = (KDINH.Where(c => c.ID_BBAN_KDINH == KDINH.Where(c2 => c2.MA_CTO == c.MA_CTO).Max(c3 => c3.ID_BBAN_KDINH))).ToList();

                // lay han kiem dinh
                var KDINHMaxHLjoiCLOAICTO = (from p in KDINHMaxHL
                                             join m in CLOAICTO
                                             on new { p.MA_CTO } equals new { m.MA_CTO }
                                             select new
                                             {
                                                 p.MA_CTO,
                                                 m.SO_PHA,
                                                 m.MA_NUOC,
                                                 m.SO_CSO,
                                                 m.DONG_DIEN,
                                                 m.HANGSO_K,
                                                 NGAY_KDINH = p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.ToString("dd/MM/yyyy"),
                                                 HAN_KDINH = m.SO_PHA.ToString() == "1" ? (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(5).ToString("dd/MM/yyyy")) : (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(2).ToString("dd/MM/yyyy"))
                                             }).ToList();

                var HANKDINH = (from p in KDINHMaxHLjoiCLOAICTO
                                join m in BDONGHTAI_CTO
                                on new { p.MA_CTO } equals new { m.MA_CTO }
                                select new
                                {
                                    p.MA_CTO,
                                    p.SO_PHA,
                                    p.MA_NUOC,
                                    p.SO_CSO,
                                    p.DONG_DIEN,
                                    HANGSO_K = p.HANGSO_K,
                                    p.NGAY_KDINH,
                                    p.HAN_KDINH,
                                    NGAY_BDONG = m.NGAY_BDONG.Date.ToString("dd/MM/yyyy")
                                }).ToList();

                // lấy TU trong DD_BDONG_HTAI
                var TU = (from p in CMIS2.DB.DD_BDONG_TU
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TUmaxID = (TU.Where(c => c.ID_BBAN == TU.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TUKdinh = (from p in TUmaxID
                               join m in CMIS2.DB.DD_KDINH_TU
                              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TU,
                                   m.NGAY_KDINH
                               }).ToList();

                // Không đúng
                //var TUKdinh = (from p in CMIS2.DB.DD_KDINH_TU
                //               join m in TUmaxID
                //              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                //               select new
                //               {
                //                   m.MA_DDO,
                //                   m.MA_TU,
                //                   p.NGAY_KDINH
                //               }).ToList();


                // lấy TI trong DD_BDONG_HTAI
                var TI = (from p in CMIS2.DB.DD_BDONG_TI
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TImaxID = (TI.Where(c => c.ID_BBAN == TI.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TIKdinh = (from p in TImaxID
                               join m in CMIS2.DB.DD_KDINH_TI
                              on new { p.MA_DVIQLY, p.MA_TI } equals new { m.MA_DVIQLY, m.MA_TI }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TI,
                                   m.NGAY_KDINH
                               }).ToList();



                #region // lấy TI trong DD_BDONG_HTAI
                /*
                var TI = (from p in CMIS2.DB.DD_BDONG_HTAI
                          where ArrMADDO.Contains(p.MA_DDO)
                          && p.LOAI_TBI == "TI"
                          select new
                          {
                              p.MA_DVIQLY,
                              p.MA_DDO,
                              p.NGAY_BDONG,
                              p.MA_CLOAI,
                              MA_TI = p.MA_TBI
                          }).ToList();

                string[] ArrTI = TI.Select(c => c.MA_TI).Distinct().ToArray();
                string[] ArrCloaiTI = TI.Select(c => c.MA_CLOAI).Distinct().ToArray();

                var CLOAITI = (from p in CMIS2.DB.D_CLOAI_TI
                               where ArrCloaiTI.Contains(p.MA_CLOAI)
                               select new
                               {
                                   p.MA_CLOAI,
                                   p.LOAI_TI,
                                   p.MO_TA,
                                   p.SO_PHA,
                                   p.TYSO_DAU,
                                   p.CAP_CXAC,
                                   p.CAP_DAP,
                                   p.MA_NUOC,
                                   p.MA_HANG
                               }).ToList();

                var TIKDINH = (from p in CMIS2.DB.DD_KDINH_TI
                               where ArrTI.Contains(p.MA_TI)
                               && p.MA_DVIQLY == strMa_dviqly
                               select p).ToList();

                var TIKDINHMaxID = TIKDINH.Where(c => c.ID_BBAN_KDINH == TIKDINH.Where(c2 => c2.MA_TI == c.MA_TI).Max(c3 => c3.ID_BBAN_KDINH));

                var TIend = (from p in TI
                             join m in TIKDINHMaxID.ToList()
                             on new { p.MA_TI } equals new { m.MA_TI }
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.MA_DDO,
                                 p.MA_TI,
                                 p.NGAY_BDONG,
                                 m.NGAY_KDINH,
                                 TYSO_TI = CLOAITI.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.TYSO_DAU).FirstOrDefault(),
                             }).ToList();
                */
                #endregion


                var joi5 = (from p in joi4
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.KY,
                                p.THANG,
                                p.NAM,
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO,
                                p.BCS,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                p.MA_CNANG,
                                m.MA_LO,
                                m.MA_TO,
                                m.MA_TRAM,
                                m.SO_COT,
                                m.SO_HOM,
                                m.PHA
                            }).ToList();



                var joi7 = (from p in joi5
                            join m in CTO
                            on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                KY = p.KY.ToString(),
                                THANG = p.THANG.ToString(),
                                NAM = p.NAM.ToString(),
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO,
                                p.BCS,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.MA_LO,
                                p.MA_TO,
                                p.MA_TRAM,
                                PHA = p.SO_PHA.ToString(),
                                CSUAT_DDO = p.CSUAT.ToString(),
                                p.SO_COT,
                                p.SO_HOM,
                                p.MA_CNANG,
                                HSN = p.HS_NHAN,
                                PHA_ABCD = p.PHA,
                                MA_NHOMNN = p.MA_NN,
                                m.MA_CLOAI,
                                m.NAM_SX,
                                m.LOAI_SOHUU,
                                NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
                                HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
                                NGAY_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault(),
                                MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                DONG_DIEN = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                HANGSO_K = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault() == null ? null : HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault(),
                                TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
                                TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
                                TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
                                CSUAT_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.CSUAT_TRAM).FirstOrDefault().ToString(),
                                MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
                                NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy"),
                                CAP_DAP = CAPDAP.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.TEN_CAPDA).FirstOrDefault(),
                                TYSO_TU = TUmaxID == null ? null : (TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TU = TUKdinh == null ? null : (TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                TYSO_TI = TImaxID == null ? null : (TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TI = TIKdinh == null ? null : (TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy"))

                            }).ToList();


                #region
                /*
                var qddo = from q in qddosogcs.ToList()
                           join p in CMIS2.DB.HDG_DIEM_DO.ToList()
                           on new { q.MA_DVIQLY, q.MA_DDO }
                           equals new { p.MA_DVIQLY, p.MA_DDO } into A1
                           from p in A1.DefaultIfEmpty()     
                           //where p.MA_DVIQLY == strMa_dviqly
                           //&& p.MA_DDO == "PA13AS0000004001"
                           select new
                           {
                               p.MA_DDO,
                               p.MA_KHANG,
                               q.MA_SOGCS,
                               //q.STT
                               //p.MA_DVIQLY,
                               //p.MA_DDO,
                               //p.MA_KHANG,
                               //p.DIA_CHI,
                               //p.SO_HO,
                               //m.MA_SOGCS,
                               //m.STT
                           };
                 * */


                /*
                var qkh = from p in CMIS2.DB.HDG_KHACH_HANG.ToList()
                          join m in qddo.ToList() on new { p.MA_DVIQLY, p.MA_KHANG }
                                                  equals new { m.MA_DVIQLY, m.MA_KHANG }
                          select new 
                          { 
                              m.MA_DVIQLY,
                              m.MA_KHANG,
                              p.TEN_KHANG,
                              m.MA_DDO,
                              m.MA_SOGCS,
                              m.SO_HO,
                              m.STT,
                              m.DIA_CHI
                          };

                var apgia = from p in CMIS2.DB.HDG_BBAN_APGIA.ToList()
                            join m in qkh.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                    equals new { m.MA_DVIQLY, m.MA_DDO }
                            select new 
                            {
                                m.MA_DVIQLY,
                                m.MA_KHANG,
                                m.TEN_KHANG,
                                m.MA_DDO,
                                m.MA_SOGCS,
                                m.SO_HO,
                                m.STT,
                                m.DIA_CHI,
                                p.DINH_MUC,
                                p.LOAI_DMUC,
                                p.MA_NHOMNN
                            };

                var chiso = from p in CMIS2.DB.GCS_CHISO.ToList()
                            join m in apgia.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                     equals new { m.MA_DVIQLY, m.MA_DDO } 
                            where p.THANG == i16ThangHD
                            && p.NAM == i16NamHD
                            && p.KY == i16Ky
                            select new 
                            {
                                m.MA_DVIQLY,
                                m.MA_KHANG,
                                m.TEN_KHANG,
                                m.MA_DDO,
                                m.MA_SOGCS,
                                m.SO_HO,
                                m.STT,
                                m.DIA_CHI,
                                m.DINH_MUC,
                                m.LOAI_DMUC,
                                m.MA_NHOMNN,
                                p.KY,
                                p.THANG,
                                p.NAM,
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO
                            };
                var vitriddo = from p in CMIS2.DB.HDG_VITRI_DDO.ToList()
                               join m in chiso.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                        equals new { m.MA_DVIQLY, m.MA_DDO }
                               select new 
                               {
                                   m.MA_DVIQLY,
                                   m.MA_KHANG,
                                   m.TEN_KHANG,
                                   m.MA_DDO,
                                   m.MA_SOGCS,
                                   m.SO_HO,
                                   m.STT,
                                   m.DIA_CHI,
                                   m.DINH_MUC,
                                   m.LOAI_DMUC,
                                   m.MA_NHOMNN,
                                   m.KY,
                                   m.THANG,
                                   m.NAM,
                                   m.CHISO_MOI,
                                   m.CHISO_CU,
                                   m.LOAI_CHISO,
                                   p.MA_TRAM,
                                   p.MA_LO,
                                   p.MA_TO,
                                   p.PHA,
                                   p.SO_COT,
                                   p.SO_HOM
                               };

                var bcs = from p in CMIS2.DB.DD_BCS_CTO.ToList()
                          join m in vitriddo.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                        equals new { m.MA_DVIQLY, m.MA_DDO }
                          select new 
                          {
                              m.MA_DVIQLY,
                              m.MA_KHANG,
                              m.TEN_KHANG,
                              m.MA_DDO,
                              m.MA_SOGCS,
                              m.SO_HO,
                              m.STT,
                              m.DIA_CHI,
                              m.DINH_MUC,
                              m.LOAI_DMUC,
                              m.MA_NHOMNN,
                              m.KY,
                              m.THANG,
                              m.NAM,
                              m.CHISO_MOI,
                              m.CHISO_CU,
                              m.LOAI_CHISO,
                              m.MA_TRAM,
                              m.MA_LO,
                              m.MA_TO,
                              m.PHA,
                              m.SO_COT,
                              m.SO_HOM,
                              p.MA_CTO,
                              p.SO_CTO,
                              p.HS_NHAN
                          };

                var hosocto = from p in CMIS2.DB.DD_HOSO_CTO.ToList()
                              join m in bcs.ToList() on new { p.MA_DVIQLY, p.MA_CTO }
                                                     equals new { m.MA_DVIQLY, m.MA_CTO }
                              select new 
                              {
                                  m.MA_DVIQLY,
                                  m.MA_KHANG,
                                  m.TEN_KHANG,
                                  m.MA_DDO,
                                  m.MA_SOGCS,
                                  m.SO_HO,
                                  m.STT,
                                  m.DIA_CHI,
                                  m.DINH_MUC,
                                  m.LOAI_DMUC,
                                  m.MA_NHOMNN,
                                  m.KY,
                                  m.THANG,
                                  m.NAM,
                                  m.CHISO_MOI,
                                  m.CHISO_CU,
                                  m.LOAI_CHISO,
                                  m.MA_TRAM,
                                  m.MA_LO,
                                  m.MA_TO,
                                  m.PHA,
                                  m.SO_COT,
                                  m.SO_HOM,
                                  m.MA_CTO,
                                  m.SO_CTO,
                                  m.HS_NHAN,
                                  p.MA_CLOAI,
                                  p.LOAI_SOHUU,
                                  p.NAM_SX
                              };

                var tramloto = from p in CMIS2.DB.D_TRAM.ToList()
                               join m in hosocto.ToList() on new { p.MA_DVIQLY, p.MA_TRAM }
                                                            equals new { m.MA_DVIQLY, m.MA_TRAM }
                               from w in CMIS2.DB.D_LO.ToList()
                               join w1 in hosocto.ToList() on new { w.MA_DVIQLY, w.MA_LO }
                                                            equals new { w1.MA_DVIQLY, w1.MA_LO }
                               from e in CMIS2.DB.D_TO.ToList()
                               join e1 in hosocto.ToList() on new { e.MA_DVIQLY, e.MA_TO }
                                                            equals new { e1.MA_DVIQLY, e1.MA_TO }
                               select new 
                               {
                                   m.MA_DVIQLY,
                                   m.MA_KHANG,
                                   m.TEN_KHANG,
                                   m.MA_DDO,
                                   m.MA_SOGCS,
                                   m.SO_HO,
                                   m.STT,
                                   m.DIA_CHI,
                                   m.DINH_MUC,
                                   m.LOAI_DMUC,
                                   m.MA_NHOMNN,
                                   m.KY,
                                   m.THANG,
                                   m.NAM,
                                   m.CHISO_MOI,
                                   m.CHISO_CU,
                                   m.LOAI_CHISO,
                                   m.MA_TRAM,
                                   m.MA_LO,
                                   m.MA_TO,
                                   m.PHA,
                                   m.SO_COT,
                                   m.SO_HOM,
                                   m.MA_CTO,
                                   m.SO_CTO,
                                   m.HS_NHAN,
                                   m.MA_CLOAI,
                                   m.LOAI_SOHUU,
                                   m.NAM_SX,
                                   p.TEN_TRAM,
                                   w.TEN_LO,
                                   e.TEN_TO
                               };

                */
                #endregion

                if (joi7.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(joi7);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu \n" + ex.ToString();
                }
                return null;
            }
        }

        //Lấy thông tin tờ ghi chỉ số công tơ điện tử  - mẫu chung NPC
        public DataSet TogcsNPC_Dtu(Int16 i16NamHD, Int16 i16ThangHD, Int16 i16Ky, string strMa_dviqly, string strMa_sogcs, string strMa_khang, string strLoaiCto, ref string strErr)
        {
            try
            {
                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                //danh sach diem do hien tai thuoc so                               
                var DDDOSOGCS = (from p in DDOMaxHL
                                 where p.MA_SOGCS == strMa_sogcs
                                 select p).ToList();

                string[] ArrDDOSOGCS = DDDOSOGCS.Select(c => c.MA_DDO).Distinct().ToArray();

                List<GCS_CHISO> GCS1 = new List<GCS_CHISO>();

                // Lấy ra những điểm đo còn treo công tơ và treo công tơ điện tử
                if (strLoaiCto == "Dtu")
                {
                    GCS1 = LayTTin_ChiSo_Dtu(strMa_dviqly, ArrDDOSOGCS);
                }
                else
                {
                    return null;
                }

                // Mảng diem do hien tai thuoc so và là điểm đo treo công tơ điện tử
                string[] ArrDDOSOGCS_Co = GCS1.Select(c => c.MA_DDO).Distinct().ToArray();



                //danh sach diem do hien tai thuoc so và treo công tơ điện tử
                var DDOSOGCSfin = (from p in DDDOSOGCS
                                   where p.MA_SOGCS == strMa_sogcs
                                   && ArrDDOSOGCS_Co.Contains(p.MA_DDO)
                                   select p).ToList();




                string[] ArrMADDO = DDOSOGCSfin.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  MA_CAPDA = "0" + p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                // Lấy cấp Điện áp của điểm đo
                var CAPDAP = (from p in DIEMDOMaxHL
                              join m in CMIS2.DB.D_CAP_DAP
                              on new { p.MA_CAPDA } equals new { m.MA_CAPDA }
                              select new
                              {
                                  p.MA_DDO,
                                  m.TEN_CAPDA
                              }).ToList();



                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select p).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }

                string[] ArrTRAM = VTDDOMaxHL.Select(c => c.MA_TRAM).Distinct().ToArray();
                string[] ArrLO = VTDDOMaxHL.Select(c => c.MA_LO).Distinct().ToArray();
                string[] ArrTO = VTDDOMaxHL.Select(c => c.MA_TO).Distinct().ToArray();

                var TRAM = (from p in CMIS2.DB.D_TRAM
                            where p.MA_DVIQLY == strMa_dviqly
                            && ArrTRAM.Contains(p.MA_TRAM)
                            select p).ToList();
                if (TRAM.Count() < 1) { strErr = "Không lấy được danh sách trạm"; }

                var LO = (from p in CMIS2.DB.D_LO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrLO.Contains(p.MA_LO)
                          select p).ToList();
                if (LO.Count() < 1) { strErr = "Không lấy được danh sách lộ"; }

                var TO = (from p in CMIS2.DB.D_TO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrTO.Contains(p.MA_TO)
                          select p).ToList();
                if (TO.Count() < 1) { strErr = "Không lấy được danh sách tổ"; }

                var DSOGCS = (from p in CMIS2.DB.D_SOGCS
                              where p.MA_DVIQLY == strMa_dviqly
                              && p.MA_SOGCS == strMa_sogcs
                              //&& p.TINH_TRANG == 1
                              select p).ToList();
                if (DSOGCS.Count < 1) { strErr = "Không lấy được D_SOGCS "; }

                var joi1 = from p in DDOSOGCSfin.ToList()
                           join m in DIEMDOMaxHL.ToList()
                           on new { p.MA_DDO } equals new { m.MA_DDO }
                           select new
                           {
                               p.MA_DDO,
                               p.MA_DVIQLY,
                               p.MA_SOGCS,
                               p.STT,
                               m.MA_KHANG,
                               m.DIA_CHI,
                               SO_HO = m.SO_HO > 1 ? (m.SO_HO - 1) : 0,
                               m.SO_PHA,
                               m.CSUAT
                           };

                string[] ArrMAKHANG = joi1.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select p).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi2 = (from p in joi1
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.SO_PHA,
                                p.CSUAT,
                                m.TEN_KHANG,
                                m.ID_HDONG,
                                m.MA_NN,
                                m.DCHI_HDON
                            }).ToList();

                //var APGIA = (from p in CMIS2.DB.HDG_BBAN_APGIA
                //             where p.MA_DVIQLY == strMa_dviqly
                //             && ArrMADDO.Contains(p.MA_DDO)
                //             select p).ToList();

                //var APGIAMaxHL = APGIA.Where(c => c.NGAY_HLUC == APGIA.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
                //if (APGIAMaxHL.Count() < 1) { strErr = "Không lấy được thông tin áp giá"; return null; }


                var joi3 = (from p in joi2
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.MA_NN,
                                p.DCHI_HDON,
                                p.SO_PHA,
                                p.CSUAT,
                                CHUOI_GIA = get_chuoigia(strMa_dviqly, p.MA_DDO),
                                DINH_MUC = ""//m.DINH_MUC
                            }).ToList();


                List<GCS_CHISO> GCS = new List<GCS_CHISO>();

                if (strLoaiCto == "Dtu")
                {
                    GCS = LayTTin_ChiSo_Dtu(strMa_dviqly, ArrMADDO);
                }
                else
                {
                    return null;
                }

                if (GCS.Count() < 1) { strErr = "Không lấy được chỉ số"; return null; }

                var GCS_AllinOne = (from p in DDOSOGCSfin
                                    where p.MA_SOGCS == strMa_sogcs
                                    select new
                                    {
                                        p.MA_DDO,
                                        CHISO_MOI_BT = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "BT").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_BT = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "BT").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_CD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "CD").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_CD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "CD").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_TD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "TD").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_TD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "TD").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_SG = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "SG").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_SG = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "SG").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_VC = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "VC").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_VC = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "VC").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        LOAI_CHISO = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.LOAI_CHISO).FirstOrDefault(),
                                        KY = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.KY).FirstOrDefault(),
                                        THANG = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.THANG).FirstOrDefault(),
                                        NAM = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.NAM).FirstOrDefault(),
                                        HS_NHAN = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.HS_NHAN).FirstOrDefault(),
                                        MA_CTO = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.MA_CTO).FirstOrDefault(),
                                        SO_CTO = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.SO_CTO).FirstOrDefault(),
                                        MA_CNANG = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.MA_CNANG).FirstOrDefault()
                                    }).ToList();

                var joi4 = (from p in joi3
                            join m in GCS_AllinOne //GCS
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                p.DCHI_HDON,
                                m.KY,
                                m.THANG,
                                m.NAM,
                                m.CHISO_MOI_BT,
                                m.CHISO_CU_BT,
                                m.CHISO_MOI_CD,
                                m.CHISO_CU_CD,
                                m.CHISO_MOI_TD,
                                m.CHISO_CU_TD,
                                m.CHISO_MOI_SG,
                                m.CHISO_CU_SG,
                                m.CHISO_MOI_VC,
                                m.CHISO_CU_VC,
                                m.LOAI_CHISO,
                                m.HS_NHAN,
                                m.MA_CTO,
                                m.SO_CTO,
                                m.MA_CNANG
                            }).ToList();


                string[] ArrMACTO = GCS.Select(c => c.MA_CTO).Distinct().ToArray();

                var CTO = (from p in CMIS2.DB.DD_HOSO_CTO
                           where p.MA_DVIQLY == strMa_dviqly
                           && ArrMACTO.Contains(p.MA_CTO)
                           select p).ToList();
                if (CTO.Count() < 1) { strErr = "Không lấy được thông tin công tơ"; return null; }

                string[] CLOAI = CTO.Select(c => c.MA_CLOAI).Distinct().ToArray();


                var D_CLOAI_CTO = (from p in CMIS2.DB.D_CLOAI_CTO
                                   where CLOAI.Contains(p.MA_CLOAI)
                                   select new { p.MA_CLOAI, p.SO_PHA, p.MA_NUOC, p.SO_CSO, p.DONG_DIEN, p.HANGSO_K }).ToList();

                var CLOAICTO = (from p in CTO
                                select new
                                {
                                    p.MA_DVIQLY,
                                    p.MA_CTO,
                                    SO_PHA = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_PHA).FirstOrDefault(),
                                    MA_NUOC = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                    SO_CSO = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                    DONG_DIEN = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                    HANGSO_K = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.HANGSO_K).FirstOrDefault()
                                }).ToList();

                var KDINH = (from p in CMIS2.DB.DD_KDINH_CTO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMACTO.Contains(p.MA_CTO)
                             select p).ToList();

                var BDONGHTAI_CTO = (from p in CMIS2.DB.DD_BDONG_HTAI
                                     where p.MA_DVIQLY == strMa_dviqly
                                     && ArrMACTO.Contains(p.MA_TBI)
                                     select new
                                     {
                                         MA_CTO = p.MA_TBI,
                                         p.NGAY_BDONG
                                     }).ToList();


                var KDINHMaxHL = (KDINH.Where(c => c.ID_BBAN_KDINH == KDINH.Where(c2 => c2.MA_CTO == c.MA_CTO).Max(c3 => c3.ID_BBAN_KDINH))).ToList();

                // lay han kiem dinh
                var KDINHMaxHLjoiCLOAICTO = (from p in KDINHMaxHL
                                             join m in CLOAICTO
                                             on new { p.MA_CTO } equals new { m.MA_CTO }
                                             select new
                                             {
                                                 p.MA_CTO,
                                                 m.SO_PHA,
                                                 m.MA_NUOC,
                                                 m.SO_CSO,
                                                 m.DONG_DIEN,
                                                 m.HANGSO_K,
                                                 NGAY_KDINH = p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.ToString("dd/MM/yyyy"),
                                                 HAN_KDINH = m.SO_PHA.ToString() == "1" ? (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(5).ToString("dd/MM/yyyy")) : (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(2).ToString("dd/MM/yyyy"))
                                             }).ToList();

                var HANKDINH = (from p in KDINHMaxHLjoiCLOAICTO
                                join m in BDONGHTAI_CTO
                                on new { p.MA_CTO } equals new { m.MA_CTO }
                                select new
                                {
                                    p.MA_CTO,
                                    p.SO_PHA,
                                    p.MA_NUOC,
                                    p.SO_CSO,
                                    p.DONG_DIEN,
                                    HANGSO_K = p.HANGSO_K,
                                    p.NGAY_KDINH,
                                    p.HAN_KDINH,
                                    NGAY_BDONG = m.NGAY_BDONG.Date.ToString("dd/MM/yyyy")
                                }).ToList();

                // lấy TU trong DD_BDONG_HTAI
                var TU = (from p in CMIS2.DB.DD_BDONG_TU
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TUmaxID = (TU.Where(c => c.ID_BBAN == TU.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TUKdinh = (from p in TUmaxID
                               join m in CMIS2.DB.DD_KDINH_TU
                              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TU,
                                   m.NGAY_KDINH
                               }).ToList();

                // Không đúng
                //var TUKdinh = (from p in CMIS2.DB.DD_KDINH_TU
                //               join m in TUmaxID
                //              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                //               select new
                //               {
                //                   m.MA_DDO,
                //                   m.MA_TU,
                //                   p.NGAY_KDINH
                //               }).ToList();


                // lấy TI trong DD_BDONG_HTAI
                var TI = (from p in CMIS2.DB.DD_BDONG_TI
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TImaxID = (TI.Where(c => c.ID_BBAN == TI.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TIKdinh = (from p in TImaxID
                               join m in CMIS2.DB.DD_KDINH_TI
                              on new { p.MA_DVIQLY, p.MA_TI } equals new { m.MA_DVIQLY, m.MA_TI }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TI,
                                   m.NGAY_KDINH
                               }).ToList();



                #region // lấy TI trong DD_BDONG_HTAI
                /*
                var TI = (from p in CMIS2.DB.DD_BDONG_HTAI
                          where ArrMADDO.Contains(p.MA_DDO)
                          && p.LOAI_TBI == "TI"
                          select new
                          {
                              p.MA_DVIQLY,
                              p.MA_DDO,
                              p.NGAY_BDONG,
                              p.MA_CLOAI,
                              MA_TI = p.MA_TBI
                          }).ToList();

                string[] ArrTI = TI.Select(c => c.MA_TI).Distinct().ToArray();
                string[] ArrCloaiTI = TI.Select(c => c.MA_CLOAI).Distinct().ToArray();

                var CLOAITI = (from p in CMIS2.DB.D_CLOAI_TI
                               where ArrCloaiTI.Contains(p.MA_CLOAI)
                               select new
                               {
                                   p.MA_CLOAI,
                                   p.LOAI_TI,
                                   p.MO_TA,
                                   p.SO_PHA,
                                   p.TYSO_DAU,
                                   p.CAP_CXAC,
                                   p.CAP_DAP,
                                   p.MA_NUOC,
                                   p.MA_HANG
                               }).ToList();

                var TIKDINH = (from p in CMIS2.DB.DD_KDINH_TI
                               where ArrTI.Contains(p.MA_TI)
                               && p.MA_DVIQLY == strMa_dviqly
                               select p).ToList();

                var TIKDINHMaxID = TIKDINH.Where(c => c.ID_BBAN_KDINH == TIKDINH.Where(c2 => c2.MA_TI == c.MA_TI).Max(c3 => c3.ID_BBAN_KDINH));

                var TIend = (from p in TI
                             join m in TIKDINHMaxID.ToList()
                             on new { p.MA_TI } equals new { m.MA_TI }
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.MA_DDO,
                                 p.MA_TI,
                                 p.NGAY_BDONG,
                                 m.NGAY_KDINH,
                                 TYSO_TI = CLOAITI.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.TYSO_DAU).FirstOrDefault(),
                             }).ToList();
                */
                #endregion


                var joi5 = (from p in joi4
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.KY,
                                p.THANG,
                                p.NAM,
                                p.CHISO_MOI_BT,
                                p.CHISO_CU_BT,
                                p.CHISO_MOI_CD,
                                p.CHISO_CU_CD,
                                p.CHISO_MOI_TD,
                                p.CHISO_CU_TD,
                                p.CHISO_MOI_SG,
                                p.CHISO_CU_SG,
                                p.CHISO_MOI_VC,
                                p.CHISO_CU_VC,
                                p.LOAI_CHISO,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                p.DCHI_HDON,
                                p.MA_CNANG,
                                m.MA_LO,
                                m.MA_TO,
                                m.MA_TRAM,
                                m.SO_COT,
                                m.SO_HOM,
                                m.PHA
                            }).ToList();



                var joi7 = (from p in joi5
                            join m in CTO
                            on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                KY = p.KY.ToString(),
                                THANG = p.THANG.ToString(),
                                NAM = p.NAM.ToString(),
                                p.CHISO_MOI_BT,
                                p.CHISO_CU_BT,
                                p.CHISO_MOI_CD,
                                p.CHISO_CU_CD,
                                p.CHISO_MOI_TD,
                                p.CHISO_CU_TD,
                                p.CHISO_MOI_SG,
                                p.CHISO_CU_SG,
                                p.CHISO_MOI_VC,
                                p.CHISO_CU_VC,
                                p.LOAI_CHISO,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.MA_LO,
                                p.MA_TO,
                                p.MA_TRAM,
                                PHA = p.SO_PHA.ToString(),
                                CSUAT_DDO = p.CSUAT.ToString(),
                                p.SO_COT,
                                p.SO_HOM,
                                HSN = p.HS_NHAN.ToString(),
                                PHA_ABCD = p.PHA,
                                MA_NHOMNN = p.MA_NN,
                                p.DCHI_HDON,
                                p.MA_CNANG,
                                m.MA_CLOAI,
                                m.NAM_SX,
                                m.LOAI_SOHUU,
                                NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
                                HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
                                NGAY_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault(),
                                MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                DONG_DIEN = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                HANGSO_K = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault() == null ? null : HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault(),
                                TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
                                TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
                                TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
                                CSUAT_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.CSUAT_TRAM).FirstOrDefault().ToString(),
                                MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
                                NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy"),
                                CAP_DAP = CAPDAP.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.TEN_CAPDA).FirstOrDefault(),
                                TYSO_TU = TUmaxID == null ? null : (TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TU = TUKdinh == null ? null : (TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                TYSO_TI = TImaxID == null ? null : (TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TI = TIKdinh == null ? null : (TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                SO_KY = DSOGCS == null ? null : DSOGCS.Where(c => c.MA_SOGCS == strMa_sogcs).Select(a => a.SO_KY).FirstOrDefault().ToString(),
                                GIA_BT = get_chuoigia_byBCS(strMa_dviqly, p.MA_DDO, "BT"),
                                GIA_CD = get_chuoigia_byBCS(strMa_dviqly, p.MA_DDO, "CD"),
                                GIA_TD = get_chuoigia_byBCS(strMa_dviqly, p.MA_DDO, "TD")

                            }).ToList();


                #region
                /*
                var qddo = from q in qddosogcs.ToList()
                           join p in CMIS2.DB.HDG_DIEM_DO.ToList()
                           on new { q.MA_DVIQLY, q.MA_DDO }
                           equals new { p.MA_DVIQLY, p.MA_DDO } into A1
                           from p in A1.DefaultIfEmpty()     
                           //where p.MA_DVIQLY == strMa_dviqly
                           //&& p.MA_DDO == "PA13AS0000004001"
                           select new
                           {
                               p.MA_DDO,
                               p.MA_KHANG,
                               q.MA_SOGCS,
                               //q.STT
                               //p.MA_DVIQLY,
                               //p.MA_DDO,
                               //p.MA_KHANG,
                               //p.DIA_CHI,
                               //p.SO_HO,
                               //m.MA_SOGCS,
                               //m.STT
                           };
                 * */


                /*
                var qkh = from p in CMIS2.DB.HDG_KHACH_HANG.ToList()
                          join m in qddo.ToList() on new { p.MA_DVIQLY, p.MA_KHANG }
                                                  equals new { m.MA_DVIQLY, m.MA_KHANG }
                          select new 
                          { 
                              m.MA_DVIQLY,
                              m.MA_KHANG,
                              p.TEN_KHANG,
                              m.MA_DDO,
                              m.MA_SOGCS,
                              m.SO_HO,
                              m.STT,
                              m.DIA_CHI
                          };

                var apgia = from p in CMIS2.DB.HDG_BBAN_APGIA.ToList()
                            join m in qkh.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                    equals new { m.MA_DVIQLY, m.MA_DDO }
                            select new 
                            {
                                m.MA_DVIQLY,
                                m.MA_KHANG,
                                m.TEN_KHANG,
                                m.MA_DDO,
                                m.MA_SOGCS,
                                m.SO_HO,
                                m.STT,
                                m.DIA_CHI,
                                p.DINH_MUC,
                                p.LOAI_DMUC,
                                p.MA_NHOMNN
                            };

                var chiso = from p in CMIS2.DB.GCS_CHISO.ToList()
                            join m in apgia.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                     equals new { m.MA_DVIQLY, m.MA_DDO } 
                            where p.THANG == i16ThangHD
                            && p.NAM == i16NamHD
                            && p.KY == i16Ky
                            select new 
                            {
                                m.MA_DVIQLY,
                                m.MA_KHANG,
                                m.TEN_KHANG,
                                m.MA_DDO,
                                m.MA_SOGCS,
                                m.SO_HO,
                                m.STT,
                                m.DIA_CHI,
                                m.DINH_MUC,
                                m.LOAI_DMUC,
                                m.MA_NHOMNN,
                                p.KY,
                                p.THANG,
                                p.NAM,
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO
                            };
                var vitriddo = from p in CMIS2.DB.HDG_VITRI_DDO.ToList()
                               join m in chiso.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                        equals new { m.MA_DVIQLY, m.MA_DDO }
                               select new 
                               {
                                   m.MA_DVIQLY,
                                   m.MA_KHANG,
                                   m.TEN_KHANG,
                                   m.MA_DDO,
                                   m.MA_SOGCS,
                                   m.SO_HO,
                                   m.STT,
                                   m.DIA_CHI,
                                   m.DINH_MUC,
                                   m.LOAI_DMUC,
                                   m.MA_NHOMNN,
                                   m.KY,
                                   m.THANG,
                                   m.NAM,
                                   m.CHISO_MOI,
                                   m.CHISO_CU,
                                   m.LOAI_CHISO,
                                   p.MA_TRAM,
                                   p.MA_LO,
                                   p.MA_TO,
                                   p.PHA,
                                   p.SO_COT,
                                   p.SO_HOM
                               };

                var bcs = from p in CMIS2.DB.DD_BCS_CTO.ToList()
                          join m in vitriddo.ToList() on new { p.MA_DVIQLY, p.MA_DDO }
                                                        equals new { m.MA_DVIQLY, m.MA_DDO }
                          select new 
                          {
                              m.MA_DVIQLY,
                              m.MA_KHANG,
                              m.TEN_KHANG,
                              m.MA_DDO,
                              m.MA_SOGCS,
                              m.SO_HO,
                              m.STT,
                              m.DIA_CHI,
                              m.DINH_MUC,
                              m.LOAI_DMUC,
                              m.MA_NHOMNN,
                              m.KY,
                              m.THANG,
                              m.NAM,
                              m.CHISO_MOI,
                              m.CHISO_CU,
                              m.LOAI_CHISO,
                              m.MA_TRAM,
                              m.MA_LO,
                              m.MA_TO,
                              m.PHA,
                              m.SO_COT,
                              m.SO_HOM,
                              p.MA_CTO,
                              p.SO_CTO,
                              p.HS_NHAN
                          };

                var hosocto = from p in CMIS2.DB.DD_HOSO_CTO.ToList()
                              join m in bcs.ToList() on new { p.MA_DVIQLY, p.MA_CTO }
                                                     equals new { m.MA_DVIQLY, m.MA_CTO }
                              select new 
                              {
                                  m.MA_DVIQLY,
                                  m.MA_KHANG,
                                  m.TEN_KHANG,
                                  m.MA_DDO,
                                  m.MA_SOGCS,
                                  m.SO_HO,
                                  m.STT,
                                  m.DIA_CHI,
                                  m.DINH_MUC,
                                  m.LOAI_DMUC,
                                  m.MA_NHOMNN,
                                  m.KY,
                                  m.THANG,
                                  m.NAM,
                                  m.CHISO_MOI,
                                  m.CHISO_CU,
                                  m.LOAI_CHISO,
                                  m.MA_TRAM,
                                  m.MA_LO,
                                  m.MA_TO,
                                  m.PHA,
                                  m.SO_COT,
                                  m.SO_HOM,
                                  m.MA_CTO,
                                  m.SO_CTO,
                                  m.HS_NHAN,
                                  p.MA_CLOAI,
                                  p.LOAI_SOHUU,
                                  p.NAM_SX
                              };

                var tramloto = from p in CMIS2.DB.D_TRAM.ToList()
                               join m in hosocto.ToList() on new { p.MA_DVIQLY, p.MA_TRAM }
                                                            equals new { m.MA_DVIQLY, m.MA_TRAM }
                               from w in CMIS2.DB.D_LO.ToList()
                               join w1 in hosocto.ToList() on new { w.MA_DVIQLY, w.MA_LO }
                                                            equals new { w1.MA_DVIQLY, w1.MA_LO }
                               from e in CMIS2.DB.D_TO.ToList()
                               join e1 in hosocto.ToList() on new { e.MA_DVIQLY, e.MA_TO }
                                                            equals new { e1.MA_DVIQLY, e1.MA_TO }
                               select new 
                               {
                                   m.MA_DVIQLY,
                                   m.MA_KHANG,
                                   m.TEN_KHANG,
                                   m.MA_DDO,
                                   m.MA_SOGCS,
                                   m.SO_HO,
                                   m.STT,
                                   m.DIA_CHI,
                                   m.DINH_MUC,
                                   m.LOAI_DMUC,
                                   m.MA_NHOMNN,
                                   m.KY,
                                   m.THANG,
                                   m.NAM,
                                   m.CHISO_MOI,
                                   m.CHISO_CU,
                                   m.LOAI_CHISO,
                                   m.MA_TRAM,
                                   m.MA_LO,
                                   m.MA_TO,
                                   m.PHA,
                                   m.SO_COT,
                                   m.SO_HOM,
                                   m.MA_CTO,
                                   m.SO_CTO,
                                   m.HS_NHAN,
                                   m.MA_CLOAI,
                                   m.LOAI_SOHUU,
                                   m.NAM_SX,
                                   p.TEN_TRAM,
                                   w.TEN_LO,
                                   e.TEN_TO
                               };

                */
                #endregion

                if (joi7.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(joi7);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu \n" + ex.ToString();
                }
                return null;
            }
        }

        //Lấy thông tin tờ ghi chỉ số tất cả các loại công tơ - mẫu chung NPC
        public DataSet TogcsNPC_All(Int16 i16NamHD, Int16 i16ThangHD, Int16 i16Ky, string strMa_dviqly, string strMa_sogcs, string strMa_khang, string strLoaiCto, ref string strErr)
        {
            try
            {
                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                //danh sach diem do hien tai thuoc so                               
                var DDDOSOGCS = (from p in DDOMaxHL
                                 where p.MA_SOGCS == strMa_sogcs
                                 select p).ToList();

                string[] ArrDDOSOGCS = DDDOSOGCS.Select(c => c.MA_DDO).Distinct().ToArray();

                List<GCS_CHISO> GCS1 = new List<GCS_CHISO>();

                // Lấy ra những điểm đo còn treo công tơ                 
                GCS1 = LayTTin_ChiSo_All(strMa_dviqly, ArrDDOSOGCS);


                // Mảng diem do hien tai thuoc so và là điểm đo treo công tơ điện tử
                string[] ArrDDOSOGCS_Co = GCS1.Select(c => c.MA_DDO).Distinct().ToArray();



                //danh sach diem do hien tai thuoc so và treo công tơ điện tử
                var DDOSOGCSfin = (from p in DDDOSOGCS
                                   where p.MA_SOGCS == strMa_sogcs
                                   && ArrDDOSOGCS_Co.Contains(p.MA_DDO)
                                   select p).ToList();




                string[] ArrMADDO = DDOSOGCSfin.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  MA_CAPDA = "0" + p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                // Lấy cấp Điện áp của điểm đo
                var CAPDAP = (from p in DIEMDOMaxHL
                              join m in CMIS2.DB.D_CAP_DAP
                              on new { p.MA_CAPDA } equals new { m.MA_CAPDA }
                              select new
                              {
                                  p.MA_DDO,
                                  m.TEN_CAPDA
                              }).ToList();



                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select p).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }

                string[] ArrTRAM = VTDDOMaxHL.Select(c => c.MA_TRAM).Distinct().ToArray();
                string[] ArrLO = VTDDOMaxHL.Select(c => c.MA_LO).Distinct().ToArray();
                string[] ArrTO = VTDDOMaxHL.Select(c => c.MA_TO).Distinct().ToArray();

                var TRAM = (from p in CMIS2.DB.D_TRAM
                            where p.MA_DVIQLY == strMa_dviqly
                            && ArrTRAM.Contains(p.MA_TRAM)
                            select p).ToList();
                if (TRAM.Count() < 1) { strErr = "Không lấy được danh sách trạm"; }

                var LO = (from p in CMIS2.DB.D_LO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrLO.Contains(p.MA_LO)
                          select p).ToList();
                if (LO.Count() < 1) { strErr = "Không lấy được danh sách lộ"; }

                var TO = (from p in CMIS2.DB.D_TO
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrTO.Contains(p.MA_TO)
                          select p).ToList();
                if (TO.Count() < 1) { strErr = "Không lấy được danh sách tổ"; }

                var DSOGCS = (from p in CMIS2.DB.D_SOGCS
                              where p.MA_DVIQLY == strMa_dviqly
                              && p.MA_SOGCS == strMa_sogcs
                              //&& p.TINH_TRANG == 1
                              select p).ToList();
                if (DSOGCS.Count < 1) { strErr = "Không lấy được D_SOGCS "; }

                var joi1 = from p in DDOSOGCSfin.ToList()
                           join m in DIEMDOMaxHL.ToList()
                           on new { p.MA_DDO } equals new { m.MA_DDO }
                           select new
                           {
                               p.MA_DDO,
                               p.MA_DVIQLY,
                               p.MA_SOGCS,
                               p.STT,
                               m.MA_KHANG,
                               m.DIA_CHI,
                               SO_HO = m.SO_HO > 1 ? (m.SO_HO - 1) : 0,
                               m.SO_PHA,
                               m.CSUAT
                           };

                string[] ArrMAKHANG = joi1.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select p).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi2 = (from p in joi1
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.SO_PHA,
                                p.CSUAT,
                                m.TEN_KHANG,
                                m.ID_HDONG,
                                m.MA_NN,
                                m.DCHI_HDON
                            }).ToList();

                //var APGIA = (from p in CMIS2.DB.HDG_BBAN_APGIA
                //             where p.MA_DVIQLY == strMa_dviqly
                //             && ArrMADDO.Contains(p.MA_DDO)
                //             select p).ToList();

                //var APGIAMaxHL = APGIA.Where(c => c.NGAY_HLUC == APGIA.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));
                //if (APGIAMaxHL.Count() < 1) { strErr = "Không lấy được thông tin áp giá"; return null; }


                var joi3 = (from p in joi2
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.MA_NN,
                                p.DCHI_HDON,
                                p.SO_PHA,
                                p.CSUAT,
                                CHUOI_GIA = get_chuoigia(strMa_dviqly, p.MA_DDO),
                                DINH_MUC = ""//m.DINH_MUC
                            }).ToList();


                List<GCS_CHISO> GCS = new List<GCS_CHISO>();
                GCS = LayTTin_ChiSo_All(strMa_dviqly, ArrMADDO);


                if (GCS.Count() < 1) { strErr = "Không lấy được chỉ số"; return null; }

                var GCS_AllinOne = (from p in DDOSOGCSfin
                                    where p.MA_SOGCS == strMa_sogcs
                                    select new
                                    {
                                        p.MA_DDO,
                                        CHISO_MOI_BT = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "BT").Select(a => a.CHISO_MOI).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "BT").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_BT = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "BT").Select(a => a.CHISO_CU).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "BT").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_CD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "CD").Select(a => a.CHISO_MOI).FirstOrDefault(),// == null ? null :GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "CD").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_CD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "CD").Select(a => a.CHISO_CU).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "CD").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_TD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "TD").Select(a => a.CHISO_MOI).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "TD").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_TD = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "TD").Select(a => a.CHISO_CU).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "TD").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_SG = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "SG").Select(a => a.CHISO_MOI).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "SG").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_SG = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "SG").Select(a => a.CHISO_CU).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "SG").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_VC = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "VC").Select(a => a.CHISO_MOI).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "VC").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_VC = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "VC").Select(a => a.CHISO_CU).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "VC").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        CHISO_MOI_KT = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "KT").Select(a => a.CHISO_MOI).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "KT").Select(a => a.CHISO_MOI).FirstOrDefault(),
                                        CHISO_CU_KT = GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "KT").Select(a => a.CHISO_CU).FirstOrDefault(),// == null ? null : GCS.Where(c => c.MA_DDO == p.MA_DDO && c.BCS == "KT").Select(a => a.CHISO_CU).FirstOrDefault(),
                                        LOAI_CHISO = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.LOAI_CHISO).FirstOrDefault(),
                                        KY = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.KY).FirstOrDefault(),
                                        THANG = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.THANG).FirstOrDefault(),
                                        NAM = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.NAM).FirstOrDefault(),
                                        HS_NHAN = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.HS_NHAN).FirstOrDefault(),
                                        MA_CTO = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.MA_CTO).FirstOrDefault(),
                                        SO_CTO = GCS.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.SO_CTO).FirstOrDefault()
                                    }).ToList();

                var joi4 = (from p in joi3
                            join m in GCS_AllinOne //GCS
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                p.DCHI_HDON,
                                m.KY,
                                m.THANG,
                                m.NAM,
                                m.CHISO_MOI_BT,
                                m.CHISO_CU_BT,
                                m.CHISO_MOI_CD,
                                m.CHISO_CU_CD,
                                m.CHISO_MOI_TD,
                                m.CHISO_CU_TD,
                                m.CHISO_MOI_SG,
                                m.CHISO_CU_SG,
                                m.CHISO_MOI_VC,
                                m.CHISO_CU_VC,
                                m.CHISO_MOI_KT,
                                m.CHISO_CU_KT,
                                m.LOAI_CHISO,
                                m.HS_NHAN,
                                m.MA_CTO,
                                m.SO_CTO
                            }).ToList();


                string[] ArrMACTO = GCS.Select(c => c.MA_CTO).Distinct().ToArray();

                var CTO = (from p in CMIS2.DB.DD_HOSO_CTO
                           where p.MA_DVIQLY == strMa_dviqly
                           && ArrMACTO.Contains(p.MA_CTO)
                           select p).ToList();
                if (CTO.Count() < 1) { strErr = "Không lấy được thông tin công tơ"; return null; }

                string[] CLOAI = CTO.Select(c => c.MA_CLOAI).Distinct().ToArray();


                var D_CLOAI_CTO = (from p in CMIS2.DB.D_CLOAI_CTO
                                   where CLOAI.Contains(p.MA_CLOAI)
                                   select new { p.MA_CLOAI, p.SO_PHA, p.MA_NUOC, p.SO_CSO, p.DONG_DIEN, p.HANGSO_K }).ToList();

                var CLOAICTO = (from p in CTO
                                select new
                                {
                                    p.MA_DVIQLY,
                                    p.MA_CTO,
                                    SO_PHA = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_PHA).FirstOrDefault(),
                                    MA_NUOC = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                    SO_CSO = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                    DONG_DIEN = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                    HANGSO_K = D_CLOAI_CTO.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.HANGSO_K).FirstOrDefault()
                                }).ToList();

                var KDINH = (from p in CMIS2.DB.DD_KDINH_CTO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMACTO.Contains(p.MA_CTO)
                             select p).ToList();

                var BDONGHTAI_CTO = (from p in CMIS2.DB.DD_BDONG_HTAI
                                     where p.MA_DVIQLY == strMa_dviqly
                                     && ArrMACTO.Contains(p.MA_TBI)
                                     select new
                                     {
                                         MA_CTO = p.MA_TBI,
                                         p.NGAY_BDONG
                                     }).ToList();


                var KDINHMaxHL = (KDINH.Where(c => c.ID_BBAN_KDINH == KDINH.Where(c2 => c2.MA_CTO == c.MA_CTO).Max(c3 => c3.ID_BBAN_KDINH))).ToList();

                // lay han kiem dinh
                var KDINHMaxHLjoiCLOAICTO = (from p in KDINHMaxHL
                                             join m in CLOAICTO
                                             on new { p.MA_CTO } equals new { m.MA_CTO }
                                             select new
                                             {
                                                 p.MA_CTO,
                                                 m.SO_PHA,
                                                 m.MA_NUOC,
                                                 m.SO_CSO,
                                                 m.DONG_DIEN,
                                                 m.HANGSO_K,
                                                 NGAY_KDINH = p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.ToString("dd/MM/yyyy"),
                                                 HAN_KDINH = m.SO_PHA.ToString() == "1" ? (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(5).ToString("dd/MM/yyyy")) : (p.NGAY_KDINH == null ? null : p.NGAY_KDINH.Value.AddYears(2).ToString("dd/MM/yyyy"))
                                             }).ToList();

                var HANKDINH = (from p in KDINHMaxHLjoiCLOAICTO
                                join m in BDONGHTAI_CTO
                                on new { p.MA_CTO } equals new { m.MA_CTO }
                                select new
                                {
                                    p.MA_CTO,
                                    p.SO_PHA,
                                    p.MA_NUOC,
                                    p.SO_CSO,
                                    p.DONG_DIEN,
                                    HANGSO_K = p.HANGSO_K,
                                    p.NGAY_KDINH,
                                    p.HAN_KDINH,
                                    NGAY_BDONG = m.NGAY_BDONG.Date.ToString("dd/MM/yyyy")
                                }).ToList();

                // lấy TU trong DD_BDONG_HTAI
                var TU = (from p in CMIS2.DB.DD_BDONG_TU
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TUmaxID = (TU.Where(c => c.ID_BBAN == TU.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TUKdinh = (from p in TUmaxID
                               join m in CMIS2.DB.DD_KDINH_TU
                              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TU,
                                   m.NGAY_KDINH
                               }).ToList();

                // Không đúng
                //var TUKdinh = (from p in CMIS2.DB.DD_KDINH_TU
                //               join m in TUmaxID
                //              on new { p.MA_DVIQLY, p.MA_TU } equals new { m.MA_DVIQLY, m.MA_TU }
                //               select new
                //               {
                //                   m.MA_DDO,
                //                   m.MA_TU,
                //                   p.NGAY_KDINH
                //               }).ToList();


                // lấy TI trong DD_BDONG_HTAI
                var TI = (from p in CMIS2.DB.DD_BDONG_TI
                          where p.MA_DVIQLY == strMa_dviqly
                          && ArrMADDO.Contains(p.MA_DDO)
                          select p).ToList();

                var TImaxID = (TI.Where(c => c.ID_BBAN == TI.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_BBAN) && c.MA_BDONG == "B")).ToList();

                var TIKdinh = (from p in TImaxID
                               join m in CMIS2.DB.DD_KDINH_TI
                              on new { p.MA_DVIQLY, p.MA_TI } equals new { m.MA_DVIQLY, m.MA_TI }
                               select new
                               {
                                   p.MA_DDO,
                                   p.MA_TI,
                                   m.NGAY_KDINH
                               }).ToList();



                #region // lấy TI trong DD_BDONG_HTAI
                /*
                var TI = (from p in CMIS2.DB.DD_BDONG_HTAI
                          where ArrMADDO.Contains(p.MA_DDO)
                          && p.LOAI_TBI == "TI"
                          select new
                          {
                              p.MA_DVIQLY,
                              p.MA_DDO,
                              p.NGAY_BDONG,
                              p.MA_CLOAI,
                              MA_TI = p.MA_TBI
                          }).ToList();

                string[] ArrTI = TI.Select(c => c.MA_TI).Distinct().ToArray();
                string[] ArrCloaiTI = TI.Select(c => c.MA_CLOAI).Distinct().ToArray();

                var CLOAITI = (from p in CMIS2.DB.D_CLOAI_TI
                               where ArrCloaiTI.Contains(p.MA_CLOAI)
                               select new
                               {
                                   p.MA_CLOAI,
                                   p.LOAI_TI,
                                   p.MO_TA,
                                   p.SO_PHA,
                                   p.TYSO_DAU,
                                   p.CAP_CXAC,
                                   p.CAP_DAP,
                                   p.MA_NUOC,
                                   p.MA_HANG
                               }).ToList();

                var TIKDINH = (from p in CMIS2.DB.DD_KDINH_TI
                               where ArrTI.Contains(p.MA_TI)
                               && p.MA_DVIQLY == strMa_dviqly
                               select p).ToList();

                var TIKDINHMaxID = TIKDINH.Where(c => c.ID_BBAN_KDINH == TIKDINH.Where(c2 => c2.MA_TI == c.MA_TI).Max(c3 => c3.ID_BBAN_KDINH));

                var TIend = (from p in TI
                             join m in TIKDINHMaxID.ToList()
                             on new { p.MA_TI } equals new { m.MA_TI }
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.MA_DDO,
                                 p.MA_TI,
                                 p.NGAY_BDONG,
                                 m.NGAY_KDINH,
                                 TYSO_TI = CLOAITI.Where(c => c.MA_CLOAI == p.MA_CLOAI).Select(c2 => c2.TYSO_DAU).FirstOrDefault(),
                             }).ToList();
                */
                #endregion


                var joi5 = (from p in joi4
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                p.KY,
                                p.THANG,
                                p.NAM,
                                p.CHISO_MOI_BT,
                                p.CHISO_CU_BT,
                                p.CHISO_MOI_CD,
                                p.CHISO_CU_CD,
                                p.CHISO_MOI_TD,
                                p.CHISO_CU_TD,
                                p.CHISO_MOI_SG,
                                p.CHISO_CU_SG,
                                p.CHISO_MOI_VC,
                                p.CHISO_CU_VC,
                                p.CHISO_MOI_KT,
                                p.CHISO_CU_KT,
                                p.LOAI_CHISO,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.SO_PHA,
                                p.CSUAT,
                                p.MA_NN,
                                p.DCHI_HDON,
                                m.MA_LO,
                                m.MA_TO,
                                m.MA_TRAM,
                                m.SO_COT,
                                m.SO_HOM,
                                m.PHA
                            }).ToList();



                var joi7 = (from p in joi5
                            join m in CTO
                            on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                KY = p.KY.ToString(),
                                THANG = p.THANG.ToString(),
                                NAM = p.NAM.ToString(),
                                p.CHISO_MOI_BT,
                                p.CHISO_CU_BT,
                                p.CHISO_MOI_CD,
                                p.CHISO_CU_CD,
                                p.CHISO_MOI_TD,
                                p.CHISO_CU_TD,
                                p.CHISO_MOI_SG,
                                p.CHISO_CU_SG,
                                p.CHISO_MOI_VC,
                                p.CHISO_CU_VC,
                                p.CHISO_MOI_KT,
                                p.CHISO_CU_KT,
                                p.LOAI_CHISO,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.MA_LO,
                                p.MA_TO,
                                p.MA_TRAM,
                                PHA = p.SO_PHA.ToString(),
                                CSUAT_DDO = p.CSUAT.ToString(),
                                p.SO_COT,
                                p.SO_HOM,
                                HSN = p.HS_NHAN.ToString(),
                                PHA_ABCD = p.PHA,
                                MA_NHOMNN = p.MA_NN,
                                p.DCHI_HDON,
                                m.MA_CLOAI,
                                m.NAM_SX,
                                m.LOAI_SOHUU,
                                NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
                                HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
                                NGAY_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault(),
                                MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                DONG_DIEN = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                HANGSO_K = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault() == null ? null : HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault(),
                                TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
                                TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
                                TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
                                CSUAT_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.CSUAT_TRAM).FirstOrDefault().ToString(),
                                MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
                                NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy"),
                                CAP_DAP = CAPDAP.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.TEN_CAPDA).FirstOrDefault(),
                                TYSO_TU = TUmaxID == null ? null : (TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TU = TUKdinh == null ? null : (TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                TYSO_TI = TImaxID == null ? null : (TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TI = TIKdinh == null ? null : (TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                SO_KY = DSOGCS == null ? null : DSOGCS.Where(c => c.MA_SOGCS == strMa_sogcs).Select(a => a.SO_KY).FirstOrDefault().ToString(),
                                GIA_BT = get_chuoigia_byBCS(strMa_dviqly, p.MA_DDO, "BT"),
                                GIA_CD = get_chuoigia_byBCS(strMa_dviqly, p.MA_DDO, "CD"),
                                GIA_TD = get_chuoigia_byBCS(strMa_dviqly, p.MA_DDO, "TD")

                            }).ToList();




                if (joi7.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(joi7);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu";
                }
                return null;
            }
        }


        // Lấy thông tin chỉ số công tơ cơ KT - mẫu chung NPC
        public List<GCS_CHISO> LayTTin_ChiSo_Co(string strMaDVi, string[] ArrDDo)
        {
            try
            {
                CMIS2.ResetDB();
                var lstchiso = ArrDDo.AsEnumerable();
                List<GCS_CHISO> CHI_SO = new List<GCS_CHISO>();

                while (lstchiso.Count() > 0)
                {
                    var tem = lstchiso.Take(1000);
                    string[] strLoai = { "KT", "VC" };
                    List<GCS_CHISO> chiso = (from i in CMIS2.DB.GCS_CHISO
                                             where i.MA_DVIQLY == strMaDVi
                                             && tem.Contains(i.MA_DDO)
                                             && strLoai.Contains(i.BCS)
                                             select i).ToList();
                    var ID_CHISO_MAX = chiso.GroupBy(c => new { c.MA_DDO, c.BCS }).Select(k => new { k.Key.MA_DDO, k.Key.BCS, ID_CHISO = k.Max(l => l.ID_CHISO) }).ToList();
                    var KQ = (from i in chiso
                              join j in ID_CHISO_MAX on new { i.MA_DDO, i.ID_CHISO } equals new { j.MA_DDO, j.ID_CHISO }
                              where !i.LOAI_CHISO.Contains("DDN")
                              select i).ToList();
                    CHI_SO = CHI_SO.Union(KQ).ToList();
                    lstchiso = lstchiso.Skip(1000);
                }

                return CHI_SO;
            }
            catch { return null; }
        }

        // Lấy thông tin chỉ số công tơ điện tử  - mẫu chung NPC
        public List<GCS_CHISO> LayTTin_ChiSo_Dtu(string strMaDVi, string[] ArrDDo)
        {
            try
            {
                CMIS2.ResetDB();
                var lstchiso = ArrDDo.AsEnumerable();
                List<GCS_CHISO> CHI_SO = new List<GCS_CHISO>();

                while (lstchiso.Count() > 0)
                {
                    var tem = lstchiso.Take(1000);
                    string[] strLoai = { "BT", "CD", "TD", "VC", "SG" };
                    List<GCS_CHISO> chiso = (from i in CMIS2.DB.GCS_CHISO
                                             where i.MA_DVIQLY == strMaDVi
                                             && tem.Contains(i.MA_DDO)
                                             && strLoai.Contains(i.BCS)
                                             select i).ToList();
                    var ID_CHISO_MAX = chiso.GroupBy(c => new { c.MA_DDO, c.BCS }).Select(k => new { k.Key.MA_DDO, k.Key.BCS, ID_CHISO = k.Max(l => l.ID_CHISO) }).ToList();
                    var KQ = (from i in chiso
                              join j in ID_CHISO_MAX on new { i.MA_DDO, i.ID_CHISO } equals new { j.MA_DDO, j.ID_CHISO }
                              where !i.LOAI_CHISO.Contains("DDN")
                              select i).ToList();
                    CHI_SO = CHI_SO.Union(KQ).ToList();
                    lstchiso = lstchiso.Skip(1000);
                }

                return CHI_SO;
            }
            catch { return null; }
        }

        // Lấy thông tin chỉ số tất cả các loại công tơ  - mẫu chung NPC
        public List<GCS_CHISO> LayTTin_ChiSo_All(string strMaDVi, string[] ArrDDo)
        {
            try
            {
                CMIS2.ResetDB();
                var lstchiso = ArrDDo.AsEnumerable();
                List<GCS_CHISO> CHI_SO = new List<GCS_CHISO>();

                while (lstchiso.Count() > 0)
                {
                    var tem = lstchiso.Take(1000);
                    string[] strLoai = { "BT", "CD", "TD", "VC", "SG", "KT" };
                    List<GCS_CHISO> chiso = (from i in CMIS2.DB.GCS_CHISO
                                             where i.MA_DVIQLY == strMaDVi
                                             && tem.Contains(i.MA_DDO)
                                             && strLoai.Contains(i.BCS)
                                             select i).ToList();
                    var ID_CHISO_MAX = chiso.GroupBy(c => new { c.MA_DDO, c.BCS }).Select(k => new { k.Key.MA_DDO, k.Key.BCS, ID_CHISO = k.Max(l => l.ID_CHISO) }).ToList();
                    var KQ = (from i in chiso
                              join j in ID_CHISO_MAX on new { i.MA_DDO, i.ID_CHISO } equals new { j.MA_DDO, j.ID_CHISO }
                              where !i.LOAI_CHISO.Contains("DDN")
                              select i).ToList();
                    CHI_SO = CHI_SO.Union(KQ).ToList();
                    lstchiso = lstchiso.Skip(1000);
                }

                return CHI_SO;
            }
            catch { return null; }
        }

        // Lấy thông tin khách hàng toàn sổ
        public DataSet DanhsachKHSogcs(string strMa_dviqly, string strMa_sogcs, string strMa_khang, ref string strErr)
        {
            try
            {

                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC));

                //danh sach diem do hien tai thuoc so
                var DDOSOGCSfin = (from p in DDOMaxHL
                                   where p.MA_SOGCS == strMa_sogcs
                                   select p).ToList();

                string[] ArrMADDO = DDOSOGCSfin.Select(c => c.MA_DDO).Distinct().ToArray();
                string[] ArrMAKHANG = DDOSOGCSfin.Select(c => c.MA_KHANG).Distinct().ToArray();

                // lấy vị trí điểm đo
                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  MA_CAPDA = "0" + p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }


                // lấy danh sách khách hàng                
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select p).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1);
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var joi1 = (from p in DDOSOGCSfin
                            join m in DIEMDOMaxHL
                            on new { p.MA_DVIQLY, p.MA_DDO } equals new { m.MA_DVIQLY, m.MA_DDO }
                            orderby p.STT
                            select new
                            {
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                m.DIA_CHI
                            }).ToList();

                var joi2 = (from p in joi1
                            join m in KHACHHANGMaxHL
                            on new { p.MA_DVIQLY, p.MA_KHANG } equals new { m.MA_DVIQLY, m.MA_KHANG }
                            select new
                            {
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                m.TEN_KHANG,
                                p.DIA_CHI

                            }).ToList();

                if (joi2 != null && joi2.Count() > 1)
                {
                    DataTable dt = Utility.LINQToDataTable(joi2);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);
                    return ds;
                }
                return null;

            }
            catch
            {
                return null;
            }
        }


        public string get_chuoigia(string strma_dviqly, string ma_ddo)
        {
            try
            {
                string strout = "";
                CMIS2.DB.Func_getchuoigia_by_maddo(strma_dviqly, ma_ddo, out strout);
                return strout;
            }
            catch
            { return ""; }
        }

        public string get_chuoigia_dathang(string strma_dviqly, string ma_ddo)
        {
            try
            {
                string strout = "";
                CMIS2.DB.Func_getchuoigia_by_maddoNPC(strma_dviqly, ma_ddo, out strout);
                return strout;
            }
            catch
            { return ""; }
        }

        public string get_chuoigia_byBCS(string strma_dviqly, string ma_ddo, string bcs)
        {
            try
            {
                string strout = "";
                CMIS2.DB.Func_GetChuoigia_By_MaDDo_BCS(strma_dviqly, ma_ddo, bcs, out strout);
                return strout;
            }
            catch
            { return ""; }
        }

        public string get_maNhomNN(string strma_divqly, string ma_ddo)
        {
            try
            {
                string strout = "";
                CMIS2.DB.Func_GetNhomNN_By_MaDDo(strma_divqly, ma_ddo, out strout);
                return strout;
            }
            catch
            { return ""; }
        }

        public IEnumerable<D_SOGCS> select_D_SOGCS_All(string strMa_dvqily, ref string strErr)
        {
            try
            {
                CMIS2.ResetDB();
                var q = from p in CMIS2.DB.D_SOGCS
                        where p.MA_DVIQLY == strMa_dvqily
                        && p.TINH_TRANG != 0
                        orderby p.MA_SOGCS ascending
                        select p;
                return q;
            }
            catch (Exception ex)
            {
                strErr = ex.Message;
                CMIS2.ResetDB(); return null;
            }
        }

        public IEnumerable<TT_SOGCS> select_TT_SOGCS_All(string strMa_dviqly, ref string strErr)
        {
            try
            {
                CMIS2.ResetDB();
                var q = from p in CMIS2.DB.TT_SOGCS
                        where p.MA_DVIQLY == strMa_dviqly
                        && p.TINH_TRANG != 0
                        orderby p.MA_SOGCS ascending
                        select p;
                return q;
            }
            catch (Exception ex)
            {
                strErr = ex.Message;
                CMIS2.ResetDB(); return null;
            }
        }

        public IEnumerable<S_LIBRARY> Get_ChucnangPhattrienMoi(string strMa_dviqly)
        {
            try
            {

                CMIS2.ResetDB();
                var q = from p in CMIS2.DB.S_LIBRARY
                        where p.NAMESPACE == "CMIS2.CapDien.usercontrols.ThiCong.CD_TreoMoi"
                        || p.NAMESPACE == "CMIS2.CapDien.usercontrols.TienIch.CD_TaoNhanhTTinKHang"
                        select p;
                return q;
            }
            catch
            {
                CMIS2.ResetDB(); return null;
            }
        }

    }
}
